C++设计模式中的观察者模式一起来看看
更新时间:2022年03月13日 12:19:13 作者:贪心的葡萄
这篇文章主要为大家详细介绍了C++观察者模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
设计模式:观察者模式
观察者模式也称发布订阅模式,发布者发布消息,订阅者接收消息。
- 发布者接口
#ifndef __observerPatterns_publish_hpp__ #define __observerPatterns_publish_hpp__ #include "observerPatterns_subscribe.hpp" class observerPatterns_publish { public: virtual void registerObjectSubscribe(observerPatterns_subscribe *ops) = 0; virtual void removeObjectSubscribe(observerPatterns_subscribe *ops) = 0; virtual void notifyObjectSubscribe() = 0; }; #endif
- 订阅者接口
#ifndef __observerPatterns_subscribe_hpp__ #define __observerPatterns_subscribe_hpp__ #include "observerPatterns_common.hpp" class observerPatterns_subscribe { public: virtual void update(const observerPatterns_msgPackage &opmp) = 0; }; #endif
- 发布者类
#ifndef __observerPatterns_object_publish_hpp__ #define __observerPatterns_object_publish_hpp__ #include <unordered_set> #include "observerPatterns_publish.hpp" class observerPatterns_object_publish : public observerPatterns_publish { private: observerPatterns_msgPackage _opmp; std::unordered_set<observerPatterns_subscribe *> _subscribeObjectBucket; public: observerPatterns_object_publish(); ~observerPatterns_object_publish(); void registerObjectSubscribe(observerPatterns_subscribe *ops); void removeObjectSubscribe(observerPatterns_subscribe *ops); void notifyObjectSubscribe(); void setMsgPackage(const observerPatterns_msgPackage &opmp); }; observerPatterns_object_publish::observerPatterns_object_publish() { } observerPatterns_object_publish::~observerPatterns_object_publish() { } void observerPatterns_object_publish::registerObjectSubscribe(observerPatterns_subscribe *ops) { _subscribeObjectBucket.insert(ops); } void observerPatterns_object_publish::removeObjectSubscribe(observerPatterns_subscribe *ops) { _subscribeObjectBucket.erase(ops); } void observerPatterns_object_publish::notifyObjectSubscribe() { for (auto &&_sob : _subscribeObjectBucket) _sob->update(_opmp); } void observerPatterns_object_publish::setMsgPackage(const observerPatterns_msgPackage &opmp) { _opmp = opmp; notifyObjectSubscribe(); } #endif
- 订阅者类
#ifndef __observerPatterns_object_subscribe_hpp__ #define __observerPatterns_object_subscribe_hpp__ #include "observerPatterns_publish.hpp" #include "observerPatterns_subscribe.hpp" class observerPatterns_object_subscribe : public observerPatterns_subscribe { private: observerPatterns_msgPackage _opmp; observerPatterns_publish *_opb; public: observerPatterns_object_subscribe(observerPatterns_publish *opb); ~observerPatterns_object_subscribe(); void update(const observerPatterns_msgPackage &opmp); }; observerPatterns_object_subscribe::observerPatterns_object_subscribe(observerPatterns_publish *opb) :_opb(opb) { _opb->registerObjectSubscribe(this); } observerPatterns_object_subscribe::~observerPatterns_object_subscribe() { _opb->removeObjectSubscribe(this); } void observerPatterns_object_subscribe::update(const observerPatterns_msgPackage &opmp) { _opmp = opmp; printf("url:%s, msg:%s\n", _opmp.url.c_str(), _opmp.msg.c_str()); } #endif
#ifndef __observerPatterns_object_subscribe2_hpp__ #define __observerPatterns_object_subscribe2_hpp__ #include "observerPatterns_publish.hpp" #include "observerPatterns_subscribe.hpp" class observerPatterns_object_subscribe2 : public observerPatterns_subscribe { private: observerPatterns_msgPackage _opmp; observerPatterns_publish *_opb; public: observerPatterns_object_subscribe2(observerPatterns_publish *opb); ~observerPatterns_object_subscribe2(); void update(const observerPatterns_msgPackage &opmp); }; observerPatterns_object_subscribe2::observerPatterns_object_subscribe2(observerPatterns_publish *opb) :_opb(opb) { _opb->registerObjectSubscribe(this); } observerPatterns_object_subscribe2::~observerPatterns_object_subscribe2() { _opb->removeObjectSubscribe(this); } void observerPatterns_object_subscribe2::update(const observerPatterns_msgPackage &opmp) { _opmp = opmp; printf("url:%s, msg:%s\n", _opmp.url.c_str(), _opmp.msg.c_str()); } #endif
- 公共头文件
#ifndef __observerPatterns_common_hpp__ #define __observerPatterns_common_hpp__ #include <string> struct observerPatterns_msgPackage { std::string url; std::string msg; }; typedef struct observerPatterns_msgPackage observerPatterns_msgPackage; #endif
- 主函数测试
/************************************************************************ > File Name: observerPatterns_main.cpp > Author: > Mail: > Created Time: ************************************************************************/ #include "observerPatterns_common.hpp" #include "observerPatterns_object_publish.hpp" #include "observerPatterns_object_subscribe.hpp" #include "observerPatterns_object_subscribe2.hpp" using namespace std; int main(int argc, char *argv[]) { observerPatterns_object_publish *opop = new observerPatterns_object_publish; observerPatterns_msgPackage opmp1, opmp2; opmp1.url = "www.aaa.com"; opmp1.msg = "Hello!"; opmp2.url = "www.xyzxyz.com"; opmp2.msg = "Hello, observerPatterns!"; observerPatterns_object_subscribe *oposa = new observerPatterns_object_subscribe(opop); observerPatterns_object_subscribe *oposb = new observerPatterns_object_subscribe(opop); observerPatterns_object_subscribe2 *oposc = new observerPatterns_object_subscribe2(opop); observerPatterns_object_subscribe2 *oposd = new observerPatterns_object_subscribe2(opop); opop->setMsgPackage(opmp1); opop->setMsgPackage(opmp2); delete oposa; delete opop; return 0; }
相关文章
C++map,set,multiset,multimap详细解析
在C++标准模板库(STL)中,容器分为关联式容器和序列式容器两大类,关联式容器主要包括set、map、multiset和multimap,通过索引来访问元素,本文给大家介绍C++ map,set,multiset,multimap的相关知识,感兴趣的朋友跟随小编一起看看吧2024-09-09
最新评论