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;
}
相关推荐
SL_staff9 分钟前
合规性折旧:当知识资产因主权缺位在审计中‘功能性清零’
java·设计模式·开源
Zane19944 小时前
工厂方法一定比简单工厂高级?三种工厂模式到底该怎么选
设计模式
Hespethorn5 小时前
设计模式是语言缺陷的补丁 —— 从工厂、单例、策略三个模式说起
设计模式
Lost of 程序猿5 小时前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
一只旭宝5 小时前
【C++复习】四种类型转换 + 常见设计模式 + Redis/MySQL(后端面试复习完整版)
c++·redis·笔记·mysql·设计模式
YYYing.7 小时前
【设计模式系列 (四) 】建造者模式
c++·后端·设计模式·建造者模式·c/c++
Zane19941 天前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Agent Loop(2026 最新版)
人工智能·设计模式·语言模型
小酒星小杜1 天前
画 AI 漫画,别只会写“日漫风”:10 种画风、适用故事和可复制提示词
人工智能·设计模式·程序员
sarasuki2 天前
为什么 Agent 工具需要一个「协议」而不是「框架」:MCP 成为标准的底层逻辑
设计模式·agent·mcp