介绍
行为型模式:主要关注对象间通信
也被称为观察者-监听者模式(发布-订阅模式)
通常用在事件驱动的编程中
实现代码
// 观察者抽象类
class Observer
{
public:
// 处理消息的接口
virtual void handle(int msgid) = 0;
};
// 第一个观察者实例
class Observer1 : public Observer
{
public:
// 处理消息的接口
void handle(int msgid)
{
// 关注消息id为1和2的消息
switch (msgid)
{
case 1:
cout << "Observer1 recv 1 msg!" << endl;
break;
case 2:
cout << "Observer1 recv 2 msg!" << endl;
break;
default:
cout << "Observer1 recv unknown msg!" << endl;
break;
}
}
};
//第二个观察者实例
class Observer2 : public Observer
{
public:
// 处理消息的接口
void handle(int msgid)
{
// 关注消息id为2的消息
switch (msgid)
{
case 2:
cout << "Observer2 recv 2 msg!" << endl;
break;
default:
cout << "Observer2 recv unknown msg!" << endl;
break;
}
}
};
//第二个观察者实例
class Observer3 : public Observer
{
public:
// 处理消息的接口
void handle(int msgid)
{
// 关注消息id为2的消息
switch (msgid)
{
case 1:
cout << "Observer3 recv 1 msg!" << endl;
break;
case 3:
cout << "Observer3 recv 3 msg!" << endl;
break;
default:
cout << "Observer2 recv unknown msg!" << endl;
break;
}
}
};
// 主题类,被订阅的类,有消息到来发布给订户
class Subject
{
public:
// 给主题增加观察者对象
void addOberver(Observer* ob, int msgid)
{
_subMap[msgid].push_back(ob);
}
// 主题检测发生改变,通知相应观察者对象处理事件
void dispatch(int msgid)
{
auto it = _subMap.find(msgid);
if (it != _subMap.end())
{
for (Observer* pObser : it->second)
{
pObser->handle(msgid);
}
}
}
private:
// unordered_map<消息id, list<订阅用户指针>>
unordered_map<int, list<Observer*>> _subMap;
};
int main()
{
Subject subject;
Observer* p1 = new Observer1();
Observer* p2 = new Observer2();
Observer* p3 = new Observer3();
// 订阅
subject.addOberver(p1, 1); // p1订阅 msgid = 1 的消息
subject.addOberver(p1, 2);
subject.addOberver(p2, 2);
subject.addOberver(p3, 1);
subject.addOberver(p3, 3);
int msgid = 0;
for (;;)
{
cout << "输入消息id:";
cin >> msgid;
if (msgid == -1)
{
break;
}
subject.dispatch(msgid);
}
return 0;
}