C++示例讲解观察者设计模式
引言用来解决两个不相关对象之间的一对一或者一对多的通信模型。什么是观察者设计模式观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。在观察者模式中主体是通知的发布者它发出通知时并不需要知道谁是它的观察者可以有任意数目的观察者订阅并接受通知。观察者模式不仅被广泛应用于软件界面元素之间的交互在业务对象之间的交互、权限管理等方面也有广泛的应用。解决的问题定义了对象间的一种一对多的组合关系以便一个对象的状态发生时所有依赖于它的对象都得到通知并自动刷新。观察者和被观察者之间存在“观察”的逻辑关系当被观察者发生变化时观察者就会观察到这样的变化并作出相应的响应。编程思路设定两者类一个为观察者类一个为被观察者类观察者类中定义一个对某个事件感兴趣的处理函数一般也叫做槽函数被观察者类中定义一个数据结构用来保存观察者对某一个事件id信号感兴趣使用数据结构建立信号与对象之间的映射关系被观察者类中定义两个方法函数一个方法为添加观察者与其感兴趣的事件id信号加入到容器中另一个方法为信号函数通知事件函数执行逻辑首先遍历容器中有没有感兴趣的事件ID如果有则代表一系列的观察者对这个事件感兴趣那么再次遍历观察者列表让每一个观察者执行相应的槽函数123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102#include iostream#include map#include listusingnamespacestd;classRecvBase{public:RecvBase(){cout RecvBase structure endl;}virtualvoidslotFunctions(intmsgid)0;virtual~RecvBase(){cout RecvBase destruct endl;}};classRecv:publicRecvBase{public:Recv(){cout Recv structure---this--- endl;}voidslotFunctions(intmsgid)override{switch(msgid){case1:cout this接收到1信号执行1信号对应的槽函数 endl;break;case2:cout this接收到2信号执行2信号对应的槽函数 endl;break;case3:cout this接收到3信号执行3信号对应的槽函数 endl;break;case4:cout this接收到4信号执行4信号对应的槽函数 endl;break;}}~Recv()override{cout Recv destruct endl;}};classSender{public:Sender(){cout sender structure endl;}mapint,listRecvBase* RecvMap;voidobserverToRecvMap(intmsgid,RecvBase* recv){this-RecvMap[msgid].push_back(recv);}voidsenderSignals(intmsgid){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;}};intmain(){Sender sender;RecvBase* r1newRecv();RecvBase* r2newRecv();RecvBase* r3newRecv();RecvBase* r4newRecv();sender.observerToRecvMap(1,r1);sender.observerToRecvMap(1,r2);sender.observerToRecvMap(2,r2);sender.observerToRecvMap(3,r3);sender.observerToRecvMap(4,r4);while(true){intmsgid;cin msgid;if(-1msgid)break;sender.senderSignals(msgid);}deleter1;deleter2;deleter3;deleter4;return0;}知识小百科this指针是本对象的起始地址用const修饰的常地址原型stu *const this本文代码中this的作用是隐藏在成员函数非静态函数的最左侧的常变量形参作用区别成员属性和成员函数的形参
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2565847.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!