C++设计模式中的观察者模式一起来看看
设计模式:观察者模式
【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#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__#include 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++单例模式的懒汉模式和饿汉模式详解
- C++|AtCoder Beginner Contest 242 C~E 题解
- C/C++系列|C++中将字符(串)转化成数字,将数字转化成字符(串)
- php|php ms17-010,PJzhang:ms17-010永恒之蓝漏洞在windows 2008R2中的复现
- 分布式系统中的降级熔断设计问题面试
- jQuery中的常用事件介绍
- 在c语言中怎样将数组赋给指针,C语言中的指针与数组
- Kubernetes|Kubernetes 中的服务发现与负载均衡
- mysql 查询语句中的 order by 对索引的影响
- 猜字母c语言蓝桥杯,第十届蓝桥杯C语言大学B组C/C++ 试题B年号字串