Design patterns--观察者模式

设计模式之观察者模式

  • 代码示例
cpp 复制代码
#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()
{

}
cpp 复制代码
#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__);
}
cpp 复制代码
#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__);
}

cpp 复制代码
#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);
}
cpp 复制代码
#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();
}

cpp 复制代码
#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;
}
相关推荐
heimeiyingwang16 分钟前
【架构实战】状态机架构:订单/工单状态流转设计
观察者模式·架构·wpf
灰子学技术3 小时前
Envoy 使用的设计模式技术文档
设计模式
Carl_奕然13 小时前
【智能体】Agent的四种设计模式之:ReAct
人工智能·设计模式·语言模型
二哈赛车手14 小时前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
楼田莉子15 小时前
仿Muduo的高并发服务器:Channel模块与Poller模块
linux·服务器·c++·学习·设计模式
geovindu1 天前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
嵌入式学习_force1 天前
02_state
设计模式·蓝牙
qcx232 天前
Warp源码深度解析(七):Token预算策略——双轨计费、上下文溢出与摘要压缩
人工智能·设计模式·rust·wrap
Cosolar2 天前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
geovindu2 天前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式