#include<iostream>
#include<unordered_map>
#include<list>
using namespace std;
/// <summary>
/// 行为型模式 : 主要关注的是对象之间的通信
///
/// Observer
/// 管擦者-监听者模式(发布-订阅模式)设计模式主要关注的是对象的一对多关系
/// 多个对象依赖一个对象,当该对象状态发生变化,依赖其的对象都能接收到对应的通知
///
///
///
/// 比如:一组数据(数据对象)=》 更具数据绘制出的图=》曲线图(对象1),饼状图(对象2
/// 当数据改变,图形也要改变</summary>
/// <returns></returns>
class Observer {
public:
//处理消息的接口
virtual void handle(int msgid) = 0;
};
//观察者实例1
class Observer1 :public Observer {
public:
void handle(int msgid) {
switch (msgid)
{
case 1:
cout << "Observer1 recv 1 msg!" << endl;
break;
case 2:
cout << "Observer1 recv 2 msg!" << endl;
break;
default:
cout << "Observer1 recv unknow msg!" << endl;
break;
}
}
};
//观察者实例2
class Observer2 :public Observer {
public:
void handle(int msgid) {
switch (msgid)
{
case 2:
cout << "Observer1 recv 2 msg!" << endl;
break;
case 3:
cout << "Observer1 recv 3 msg!" << endl;
break;
default:
cout << "Observer1 recv unknow msg!" << endl;
break;
}
}
};
class Subject
{
public:
//给主题增加观察者对象
void addObserver(Observer* obser, int msgid) {
//_subMap[msgid].push_back(obser); //有msgid就直接添加 没有自己会创建
auto it = _subMap.find(msgid);
if (it!= _subMap.end()) {
it->second.push_back(obser);
}
else {
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:
unordered_map<int, list<Observer*>> _subMap;
};
int main() {
Subject subject;
Observer* p1 = new Observer1();
Observer* p2 = new Observer2();
subject.addObserver(p1, 1);
subject.addObserver(p1, 2);
subject.addObserver(p2, 2);
subject.addObserver(p2, 3);
int msgid = 0;
for (;;) {
cin >> msgid;
if (msgid == -1) {
break;
}
subject.dispatch(msgid);
}
return 0;
}
/*1
Observer1 recv 1 msg!
2
Observer1 recv 2 msg!
Observer1 recv 2 msg!
3
Observer1 recv 3 msg!*/
设计模式-观察者模式
最新推荐文章于 2024-09-17 22:21:07 发布