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;
}
相关推荐
付聪12105 小时前
装饰器模式
设计模式
扣丁梦想家5 小时前
设计模式教程:外观模式(Facade Pattern)
设计模式·外观模式
強云5 小时前
23种设计模式 - 装饰器模式
c++·设计模式·装饰器模式
強云5 小时前
23种设计模式 - 外观模式
设计模式·外观模式
鄃鳕6 小时前
单例模式【C++设计模式】
c++·单例模式·设计模式
扣丁梦想家9 小时前
设计模式教程:命令模式(Command Pattern)
设计模式·命令模式
強云10 小时前
23种设计模式 - 迭代器模式
设计模式·迭代器模式
小王子102410 小时前
设计模式Python版 迭代器模式
python·设计模式·迭代器模式
道友老李10 小时前
【设计模式精讲】创建型模式之原型模式(深克隆、浅克隆)
设计模式·原型模式
攻城狮7号10 小时前
【第二节】C++设计模式(创建型模式)-抽象工厂模式
c++·设计模式·抽象工厂模式