C++设计模式 观察者模式(发布者给订阅者发通知) 拼搏现实的明天。 2022-09-10 10:14 174阅读 0赞 ### 文章目录 ### * 1. 观察者模式: ObserverPattern * 2. 应用 * 3. 逻辑代码 * 4. 代码示例 # 1. 观察者模式: ObserverPattern # 定义对象间的一种一对多依赖关系, 使得每当一个对象状态发生改变时, 其相关依赖对象皆得到通知并自动更新 # 2. 应用 # 最经典的应用就是我们订阅邮件, 当有新的文章发表, 发布者会通过邮件给我们这些订阅者发送通知, 我们就知道了更新的文章 # 3. 逻辑代码 # * 创建list链表保存所有的观察者基类指针 * 创建state状态标志位, 状态转换后通知更新给所有的观察者 // 抽象订阅者, 贷款人 为所有的具体观测者定义一个接口, 在得到老大的通知时, 更新自己 class Observer{ public: virtual ~Observer(){ } virtual void Update() = 0; }; // 主体对象, 通知者, 借款人 class Subject{ private: list<Observer*> observers_; // 保存订阅者 public: // 增加订阅者 void Attach(Observer *observer){ observers_.push_back(observer); } // 移除订阅者 void Detach(Observer *observer){ observers_.remove(observer); } // 通知订阅者 void Notify(){ for(const auto &a : observers_){ a->Update(); } } }; // 通知者主体 class ConcreteSubject: public Subject{ private: string subjectState_; public: string getState(){ return this->subjectState_; } void SetState(string value){ subjectState_ = value; } }; // 订阅者主体 class ConcreteObserver : public Observer{ private: string name_; string observerState_; ConcreteSubject *subject_ = nullptr; public: ConcreteObserver(ConcreteSubject *subject, string name): subject_(subject), name_(name){ } void Update(){ observerState_ = subject_->getState(); // 得到通知者当前状态 cout << "订阅者" << name_ <<" 的新状态是" << observerState_ << endl; } ConcreteSubject* getSubject(){ if(subject_ != nullptr) return subject_; } void setSubject(ConcreteSubject *subject){ subject_ = subject; } }; int main(int argc, char const *argv[]) { ConcreteSubject *s = new ConcreteSubject(); // 创建一个通知者, 用来给订阅者发送信息 ConcreteObserver *x = new ConcreteObserver(s, "X"); ConcreteObserver *y = new ConcreteObserver(s, "Y"); ConcreteObserver *z = new ConcreteObserver(s, "Z"); s->Attach(x); // 给通知者增加一个订阅者X, s->Attach(y); // 给通知者增加一个订阅者Y, s->Attach(z); // 给通知者增加一个订阅者Z, s->SetState("ABC"); s->Notify(); ConcreteSubject *s2 = new ConcreteSubject(); // 创建另一个通知者 s2->Attach(x); // 给这个通知者增加一个订阅者 s2->SetState("BEEE"); // 设置通知者当前状态 x->setSubject(s2); // 给这个订阅者更换通知者 s2->Notify(); // 给所有的订阅者通知 delete s; delete x; delete y; delete z; delete s2; return 0; } # 4. 代码示例 # ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA6JC95a2Q5peg5oKUIQ_size_20_color_FFFFFF_t_70_g_se_x_16] #include <iostream> #include <algorithm> // reverse #include <vector> #include <list> using namespace std; /* 观察者模式: 有两个银行, 赵四和王五开的 张三跟赵四和王五借款后(行为), 没有钱(状态), 所以无法还给银行,只能等有钱才能还 银行如何知道张三有钱呢? 方法1: 天天给张三打电话询问 方法2: 张三有了通知银行(显然这种方法更高效) 下面的代码就是实现了这样的一种方案: 当一个对象状态发生改变, 其他依赖对象得到通知, 并进行自动的更新 */ // 银行 class Credit{ public: virtual void takeMoney()=0; }; // 赵四家的银行 class Zhao4: public Credit{ public: void takeMoney(){ cout<< "赵四收到了通知, 拿到了钱" <<endl; } }; // 王五家的银行 class Wang5: public Credit{ public: void takeMoney(){ cout<< "王五收到了通知, 拿到了钱" <<endl; } }; // 借款方 class Debit{ public: virtual void borrow(Credit *c)=0; // 借钱 virtual void notifyCredit() = 0; // 通知 }; // 借款人 张三 class ZhangSan: public Debit{ private: list<Credit*> allCredits; // 表示贷款了几个银行 bool state = false; // 表示有钱没钱 public: void borrow(Credit *c){ allCredits.emplace_back(c); } // 遍历所有银行, 通知有钱了 void notifyCredit(){ for(Credit *a: allCredits){ a->takeMoney(); } } }; int main() { Credit *zhao4 = new Zhao4(); Credit *wang5 = new Wang5(); Debit *zhangsan = new ZhangSan(); zhangsan->borrow(zhao4); zhangsan->borrow(wang5); // 一定时间后, 转到钱了, state改变, 通知所有银行 zhangsan->notifyCredit(); return 0; } [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA6JC95a2Q5peg5oKUIQ_size_20_color_FFFFFF_t_70_g_se_x_16]: /images/20220829/dbd15909d89a4c59b67dbaf7a0029545.png
相关 java设计模式--观察者(发布订阅) *1、概述: ** 观察者模式又称“发布订阅模式”定义一种一对多的依赖关系,让多个观察者对象同时监视着被观察者的状态,当被观察者的状态发送变... 旧城等待,/ 2024年04月17日 20:15/ 0 赞/ 99 阅读
相关 观察者模式 vs 发布订阅模式 目录 场景 观察者模式 发布订阅模式 总结 -------------------- 场景 有一回面试,面试官问: 末蓝、/ 2023年10月06日 19:03/ 0 赞/ 32 阅读
相关 C++设计模式 观察者模式(发布者给订阅者发通知) 文章目录 1. 观察者模式: ObserverPattern 2. 应用 3. 逻辑代码 4. 代码示例 1. 观察者模式: Observer 拼搏现实的明天。/ 2022年09月10日 10:14/ 0 赞/ 175 阅读
相关 订阅发布和观察者模式 发布订阅模式 > 把多个方法暂存起来,最后一次触发执行 作用: 解偶 使用场景: 如,多个类或者函数内,可以分散订阅某个操作,最后统一发布。分散的好处就是不 ╰+攻爆jí腚メ/ 2022年08月28日 14:47/ 0 赞/ 223 阅读
相关 js 订阅者模式(观察者模式) 原文网址:http://www.cnblogs.com/LuckyWinty/p/5796190.html [附加题] 请实现下面的自定义事件 Event 对 悠悠/ 2022年07月15日 13:15/ 0 赞/ 215 阅读
相关 观察者模式(发布-订阅者模式) 观察者模式定义了一种依赖关系,解决了主体对象和观察者之间功能的耦合,主要应用于大型项目的模块化开发中,解决团队开发中模块之间的通信问题,利用观察者模式还可以实现自定义事件。 素颜马尾好姑娘i/ 2022年05月22日 06:00/ 0 赞/ 236 阅读
相关 设计模式之观察者模式(发布订阅模式) 说明:本文参照《大话设计模式》中的案例做简要解析 观察者模式: 又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。 深藏阁楼爱情的钟/ 2022年05月21日 10:39/ 0 赞/ 284 阅读
相关 javascript 观察者模式 发布订阅模式 观察者模式 观察者模式,每一个观察者对象有两个方法 添加监听`subscribe` 发布事件`publish` 观察者有个`list`存放所有的已经添加监 本是古典 何须时尚/ 2022年04月24日 10:14/ 0 赞/ 231 阅读
相关 发布订阅模式(观察者模式) 设计模式的目的就是使类成为可复用的组件。 在观察者模式中观察者接口只注重被观察者,而被观察者接口只注重观察者,具体是观察者接口实现类中的哪一个并不在意,而被观察者也是如此。这 清疚/ 2021年12月15日 00:27/ 0 赞/ 311 阅读
还没有评论,来说两句吧...