当前位置: 首页 > news >正文

Design patterns--观察者模式

设计模式之观察者模式

  • 代码示例
#ifndef OBSERVER_H
#define OBSERVER_H#include <map>class Observer
{
public:Observer();virtual void update(std::map<int, double>) = 0;
};
#endif // OBSERVER_H#include "observer.h"Observer::Observer()
{}
#ifndef KAFKAPUSHER_H
#define KAFKAPUSHER_H
#include "observer.h"
#include <map>class KafkaPusher : public Observer
{
public:KafkaPusher();void update(std::map<int, double> msgPoints) override;void display();private:std::map<int, double> m_sailing;
};#endif // KAFKAPUSHER_H#include "kafkapusher.h"KafkaPusher::KafkaPusher()
{}void KafkaPusher::update(std::map<int, double> msgPoints)
{for(auto itr = msgPoints.begin(); itr != msgPoints.end(); ++itr){if(itr->first % 2 != 0){m_sailing[itr->first] = itr->second;}}
}void KafkaPusher::display()
{for(auto itr = m_sailing.begin(); itr != m_sailing.end(); ++itr){printf("%d:%.3f, ", itr->first, itr->second);}printf("\n[%s:%d]\n", __FILE__, __LINE__);
}
#ifndef RABBITMQPUSHER_H
#define RABBITMQPUSHER_H
#include "observer.h"class RabbitMQPusher : public Observer
{
public:RabbitMQPusher();void update(std::map<int, double> msgPoints) override;void display();private:std::map<int, double> m_engine;
};#endif // RABBITMQPUSHER_H#include "rabbitmqpusher.h"RabbitMQPusher::RabbitMQPusher()
{}void RabbitMQPusher::update(std::map<int, double> msgPoints)
{for(auto itr = msgPoints.begin(); itr != msgPoints.end(); ++itr){if(itr->first % 2 == 0){m_engine[itr->first] = itr->second;}}
}void RabbitMQPusher::display()
{for(auto itr = m_engine.begin(); itr != m_engine.end(); ++itr){printf("%d:%.3f, ", itr->first, itr->second);}printf("\n[%s:%d]\n", __FILE__, __LINE__);
}

#ifndef SUBSCRIBER_H
#define SUBSCRIBER_H#include <list>
#include "observer.h"class Subscriber
{
public:Subscriber();void registerObserver(Observer* obItem);void removeObserver(Observer* obItem);virtual void notify() = 0;protected:std::list<Observer*> m_listObserver;
};#endif // SUBSCRIBER_H#include "subscriber.h"Subscriber::Subscriber()
{}void Subscriber::registerObserver(Observer* obItem)
{m_listObserver.push_back(obItem);
}void Subscriber::removeObserver(Observer* obItem)
{m_listObserver.remove(obItem);
}
#ifndef WORKER_H
#define WORKER_H#include <map>
#include <list>
#include "subscriber.h"class Worker : public Subscriber
{
public:Worker();void notify() override;void alterOperationPoints(std::map<int, double> op);private:std::map<int, double> m_OperatePoints;
};#endif // WORKER_H#include "worker.h"
#include <cstdlib>
#include <ctime>Worker::Worker()
{}void Worker::notify()
{std::list<Observer*>::iterator itr;for(itr = m_listObserver.begin(); itr != m_listObserver.end(); ++itr){(*itr)->update(m_OperatePoints);}
}void Worker::alterOperationPoints(std::map<int, double> op)
{srand(time(0));for(int i = 51; i <= 60; i++){int random_number = rand() % 100 + 1;printf("%d ", random_number);m_OperatePoints[i] = random_number;}printf("\n");notify();
}

#include <iostream>
#include <unistd.h>
#include "worker.h"
#include "kafkapusher.h"
#include "rabbitmqpusher.h"using namespace std;int main()
{KafkaPusher kPush;RabbitMQPusher rPush;Worker worker;worker.registerObserver(&kPush);worker.registerObserver(&rPush);std::map<int, double> bigData;while (true) {worker.alterOperationPoints(bigData);kPush.display();rPush.display();sleep(2);}cout << "==Over==" << endl;return 0;
}
http://www.lryc.cn/news/187642.html

相关文章:

  • 【Spring Boot】SpringBoot 单元测试
  • ansible 调研
  • QT UI控件汇总介绍
  • 【垃圾回收概述及算法】
  • 2021年03月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 为什么通过一致性正则化方法就可以避免将所有未标记数据集分配给同一类?
  • 第4章 决策树
  • 在Remix中编写你的第一份智能合约
  • 如何查看dll文件内导出函数名称
  • 学习笔记|串口通信的基础知识|同步/异步|RS232|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础
  • JAVA String 和 String[][]互转的两种方法
  • 推荐几个制作svg的工具
  • Java实现防重复提交,使用自定义注解的方式
  • Springboot实现Web组件注册
  • Element组件案例 Vue路由 前端打包部署步骤
  • mysql5.7停止维护时间
  • 解密.kat6.l6st6r勒索病毒:保护数据的关键方法
  • Godot 添加信号
  • JS如何判断文字是否溢出(被ellipsis)?
  • pb:常用函数和语句清单
  • (8)SpringMVC中的视图类型及其特点,以及视图控制器view-controller的配置
  • ansible学习笔记分享
  • 以dzzoffice为例设置通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证)
  • 加拿大艾伯塔省执法部门利用OpenText Encase显着提高案件效率
  • 【Codeforces】Educational Codeforces Round 156 [Rated for Div. 2]
  • 结合swagger的前端架构小记
  • Python字典全解析:从基础到高级应用
  • Fourier变换中的能量积分及其详细证明过程
  • 保护 Web 服务器安全性
  • docker数据管理和网络通信