设计模式:观察者模式
观察者模式也称发布订阅模式,发布者发布消息,订阅者接收消息。
- 发布者接口
#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#include "observerPatterns_publish.hpp" class observerPatterns_object_publish : public observerPatterns_publish { private: observerPatterns_msgPackage _opmp; std::unordered_set _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__ #includestruct 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; }