行为型模式:主要关注的是对象之间的通信
观察者-监听者模式(发布-订阅模式):主要关注的是对象的一对多的关系,也就是多个对象依赖一个对象,当该对象的状态发生变化时,其他对象能都接收到相应的通知。
#include <iostream>
#include <unordered_map>
#include <list>
using namespace std;
class Observer {
public:
virtual void handle(int msgid) = 0;
};
class Observer1 : public Observer {
public:
void handle(int msgid) {
switch (msgid) {
case 1:
cout << "ob1 recv msg1" << endl;
break;
default:
break;
}
}
};
class Observer2 : public Observer {
public:
void handle(int msgid) {
switch (msgid) {
case 2:
cout << "ob2 recv msg2" << endl;
break;
default:
break;
}
}
};
class Subject {
public:
void addObserver(Observer* obser, int msgid) {
auto it = m_subs.find(msgid);
if (it != m_subs.end()) {
it->second.push_back(obser);
}
else {
list<Observer*> li;
li.push_back(obser);
m_subs.insert({ msgid, li });
}
}
// 主题发生变化
void dispatch(int msgid) {
auto it = m_subs.find(msgid);
if (it != m_subs.end()) {
for (Observer* ptr : it->second) {
ptr->handle(msgid);
}
}
}
private:
unordered_map<int, list<Observer*>> m_subs;
};
int main() {
Subject sub;
Observer* p1 = new Observer1();
Observer* p2 = new Observer2();
sub.addObserver(p1, 1);
sub.addObserver(p2, 2);
int msgid = 0;
for (;;) {
cin >> msgid;
if (msgid == -1)
break;
sub.dispatch(msgid);
}
}