引言
用来解决两个不相关对象之间的一对一或者一对多的通信模型。
什么是观察者设计模式
观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接受通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。
解决的问题
定义了对象间的一种一对多的组合关系,以便一个对象的状态发生时,所有依赖于它的对象都得到通知并自动刷新。
观察者和被观察者之间存在“观察”的逻辑关系,当被观察者发生变化时,观察者就会观察到这样的变化,并作出相应的响应。
编程思路
-
设定两者类,一个为观察者类,一个为被观察者类
-
观察者类中,定义一个对某个事件感兴趣的处理函数,一般也叫做槽函数
-
被观察者类中,定义一个数据结构,用来保存观察者对某一个事件id(信号)感兴趣,使用数据结构建立信号与对象之间的映射关系
-
被观察者类中,定义两个方法函数:
一个方法为:添加观察者与其感兴趣的事件id(信号)加入到容器中
另一个方法为:信号函数:通知事件函数执行逻辑:首先遍历容器中,有没有感兴趣的事件ID,如果有,则代表一系列的观察者,对这个事件感兴趣,那么再次遍历观察者列表,让每一个观察者执行相应的槽函数
#include <iostream>
#include <map>
#include <list>
using namespace std;
class RecvBase
{
public:
RecvBase()
{
cout << "RecvBase structure" << endl;
}
virtual void slotFunctions(int msgid)=0;
virtual ~RecvBase()
{
cout << "RecvBase destruct" << endl;
}
};
class Recv:public RecvBase
{
public:
Recv()
{
cout << "Recv structure" << "---" << this << "---" << endl;
}
void slotFunctions(int msgid)override
{
switch(msgid)
{
case 1:
cout << this << "接收到1信号,执行1信号对应的槽函数" << endl;
break;
case 2:
cout << this << "接收到2信号,执行2信号对应的槽函数" << endl;
break;
case 3:
cout << this << "接收到3信号,执行3信号对应的槽函数" << endl;
break;
case 4:
cout << this << "接收到4信号,执行4信号对应的槽函数" << endl;
break;
}
}
~Recv()override
{
cout << "Recv destruct" << endl;
}
};
class Sender
{
public:
Sender()
{
cout << "sender structure" << endl;
}
map<int,list<RecvBase* >> RecvMap;
void observerToRecvMap(int msgid,RecvBase* recv)
{
this->RecvMap[msgid].push_back(recv);
}
void senderSignals(int msgid)
{
auto it = RecvMap.find(msgid);
if(it!=RecvMap.end())
{
for(RecvBase* p:it->second)
{
p->slotFunctions(msgid);
}
}else{
cout << "接收到未知信号,没有对应的可执行槽函数" << endl;
}
}
~Sender()
{
cout << "sender destruct" << endl;
}
};
int main()
{
Sender sender;
RecvBase* r1=new Recv();
RecvBase* r2=new Recv();
RecvBase* r3=new Recv();
RecvBase* r4=new Recv();
sender.observerToRecvMap(1,r1);
sender.observerToRecvMap(1,r2);
sender.observerToRecvMap(2,r2);
sender.observerToRecvMap(3,r3);
sender.observerToRecvMap(4,r4);
while(true)
{
int msgid;
cin >> msgid;
if(-1==msgid)break;
sender.senderSignals(msgid);
}
delete r1;
delete r2;
delete r3;
delete r4;
return 0;
}
知识小百科
this指针:
- 是本对象的起始地址,用
const
修饰的常地址(原型:stu *const this
)(本文代码中this的作用) - 是隐藏在成员函数(非静态函数)的最左侧的常变量形参
作用:
- 区别成员属性和成员函数的形参
- 解引用,返回本对象的地址
转载:https://blog.csdn.net/distant_Rove666/article/details/128430279
查看评论