设计模式:观察者模式

#include <iostream>
#include <unordered_map>
#include <list>
/*
行为模式:主要是关注的对象之间的通信
观察者-监听模式(发布-订阅模式)设计模式:主要关注的是对象的一对多的关系,也就是多个对象都依赖一个对象,
当该对象的状态发生改变时,其它对象都能够接收到相应的通知
一组数据(数据对象)=》通过这一组数据=>曲线图(对象1)/柱状图(对象2)/圆饼图(对象3)
当数据对象改变时,对象1,对象2,对象3应该及时的收到相应的通知
*/

//观察者抽象类
class Observer
{
public:
    virtual void handle(int msgid) = 0;
};
//第一个观察者
class Observer1 :public Observer
{
public:
    void handle(int msgid)
    {
        switch (msgid)
        {
        case 1:
            std::cout << "Observer1 recv 1 msg!" << std::endl;
            break;
        case 2:
            std::cout << "Observer1 recv  2 msg" << std::endl;
            break;
        default:
            std::cout << "Observer1 recv unkow msg" << std::endl;

        }
    }
};
//第二个观察者
class Observer2 :public Observer
{
public:
    void handle(int msgid)
    {
        switch (msgid)
        {
        case 2:
            std::cout << "Observer2 recv 2 msg!" << std::endl;
            break;      
        default:
            std::cout << "Observer2 recv unkow msg" << std::endl;

        }
    }
};
//第三个观察者
class Observer3 :public Observer
{
public:
    void handle(int msgid)
    {
        switch (msgid)
        {
        case 1:
            std::cout << "Observer3 recv 1 msg!" << std::endl;
            break;
        case 3:
            std::cout << "Observer3 recv  3 msg" << std::endl;
            break;
        default:
            std::cout << "Observer3 recv unkow msg" << std::endl;

        }
    }
};
//主题类
class Subject
{
public:
    //给主题增加观察者对象
    void addObserver(Observer* obser, int msgid)
    {
        _subMap[msgid].push_back(obser);
        //下面代码相当于上面一行的代码实现
       /* auto it = _subMap.find(msgid);
        if (it!= _subMap.end())
        {
            it->second.push_back(obser);
        }
        else
        {
            std::list<Observer*> lis;
            lis.push_back(obser);
            _subMap.insert({ {msgid,lis} });

        }*/
    }
     //主题监测发生改变,通知相应的观察者对象处理事件
    void dispatch(int msgid)
    {
        auto it = _subMap.find(msgid);
        if (it != _subMap.end())
        {
            for (Observer* pObser : it->second)
            {
                pObser->handle(msgid);
            }
        }
    }
private:
    std::unordered_map<int, std::list<Observer*>> _subMap;    
};
int main()
{
    Subject subject;
    Observer* p1 = new Observer1();
    Observer* p2 = new Observer2();
    Observer* p3 = new Observer3();
    subject.addObserver(p1, 1);
    subject.addObserver(p1, 2);
    subject.addObserver(p2, 2);
    subject.addObserver(p3, 1);
    subject.addObserver(p3, 3);

    int msgid = 0;
    for (;;)
    {
        std::cout << "输入消息id:";
        std::cin >> msgid;
        if (msgid == -1)
        {
            break;
        }
        subject.dispatch(msgid);
    }
    std::cout << "Hello World!\n";
}

输出结果如下:

输入消息id:1
Observer1 recv 1 msg!
Observer3 recv 1 msg!
输入消息id:2
Observer1 recv  2 msg
Observer2 recv 2 msg!
输入消息id:32
输入消息id:3
Observer3 recv  3 msg
输入消息id:4
输入消息id:5
输入消息id:
posted @ 2025-11-07 20:14  焦涛  阅读(8)  评论(0)    收藏  举报