1. 观察者模式总结(C++)
1. 介绍
观察者模式:定义了一种“一对多”的依赖关系,让多个观察者对象同时监听一个对象的改变,即当该对象的状态发现改变时,会通知所有它依赖的观察者对象。观察者模式属于行为模式。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:通知其他对象有一个对象的状态改变,而且同时要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
直白点,观察者模式就是构建“事件”来通知某种状态的改变。
观察者模式提供了一种对象设计,让主题和观察者之间松耦合:
- 运行时我们用新的观察者取代现有的观察者,主题不会受到影响;
- 有新类型的观察者出现时,主题代码不需要更改;
- 可以轻易地独立使用或复用主题或者观察者;
- 改变主题或者观察者的任何一方都不会影响另一方。
2. UML
简单的UML图可以表示如下:
观察者模式定义了四种角色:抽象主题、具体主题、抽象观察者、具体观察者。
抽象主题(Subject):该角色是一个抽象类或接口,定义了增加、删除、通知观察者对象的方法。
具体主题(ConcreteSubject):该角色继承或实现了抽象主题,定义了一个集合存入注册过的具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
抽象观察者(Observer):该角色是具体观察者的抽象类,定义了一个更新方法。
具体观察者(ConcrereObserver):该角色是具体的观察者对象,在得到具体主题更改通知时更新自身的状态。
C++中具体存在的类各你的代码设计有关,可能某个类同时承担抽象主题和具体主题,或者抽象观察者和具体观察者的角色。
3. 具体实例
首先观察者类:
class Observer
{ public: virtual void OnUpdata() = 0;
};class AObserver : public Observer
{ public: virtual void OnUpdata() {std::cout << "-------OnUpdata----A----";}
};class BObserver : public Observer
{ public: virtual void OnUpdata() {std::cout << "-------OnUpdata----B----";}
};
然后主题类:
class SubjectBase{
public: virtual void AddObserver(std::shared_ptr<Observer> observer) = 0; virtual void RemoveObserver(std::shared_ptr<Observer> observer) = 0; virtual void NotifyUpdate() = 0;
};class SubjectTest : public SubjectBase {
public: void AddObserver(std::shared_ptr<Observer> observer) override {observers_.push_back(observer);} void RemoveObserver(std::shared_ptr<Observer> observer) override {observers_.remove(observer)}void NotifyUpdate() override {for(auto observer : observers_)observers_->OnUpdata();}
private:std::list<std::shared_ptr<Observer> > observers_;
};
Chromium代码中有大量使用观察者模式,比如网络的连接、应用的启动和关闭等等。
转载于:https://www.cnblogs.com/xl2432/p/10093937.html
1. 观察者模式总结(C++)相关推荐
- Java设计模式:观察者模式
观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 如果这句话不好理解 可 ...
- 观察者模式的经典应用(猫叫 烧开水)
Code 猫叫了 老鼠跑 主人惊醒 1/**//* 2 * 题目: 3 * 猫叫了,所有老鼠开始逃跑,主人被惊醒,请用OO的思想描绘此过程 4 * 1,老鼠跟主人是被动的 5 * 2,要考虑 ...
- Observer Pattern 观察者模式
Observer Pattern (观察者模式) 定义: <设计模式>中对Observer模式的意图是这样描述的:"定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, ...
- 设计模式之观察者模式(Observer)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- java观察者模式_Java设计模式之观察者模式详解
观察者模式,是一对多的关系,一个主题对应多个观察者,当这个主题发生变化的时候,所有观察着这个主题的观察者都会接收到通知来获悉主题的变化. 在现实中我们也会遇到许许多多应用观察者模式的行为,比如电视的节 ...
- python 设计模式 观察者_python设计模式之观察者模式
说到观察者模式,在我脑海中总是闪现,这家伙跟消息队列的主题发布订阅有什么关系,虽然本人对消息队列没有很深的研究,但是凭直觉我就认为消息队列的实现就使用了观察者模式吧,所以本文就来模拟消息队列的丐版实现 ...
- JS设计模式-观察者模式
观察者(又称发布订阅)模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 原文链接 应用场景 当用户在网页执行一些操作(如点击)后就需要执行 ...
- 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现
1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject {publi ...
- 步步为营-44-窗体之间传值--观察者模式
说明 :观察者模式又叫发布-订阅模式,其中又涉及到中介者模式 1 结构 2 创建Main窗体(中介者),ChildForm1(发布者),ChildForm2(订阅者),ChildForm3(订阅者), ...
- 观察者模式的Java实现及应用
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Turwe www.jianshu.com/p/1025f6 ...
最新文章
- SAP MM 采购发票上的金额小差异
- 题目1154:Jungle Roads
- Linux Performance Observability Tools
- hdu 2094 “产生冠军”——set容器的应用
- wineskin使用教程_使用Wineskin在Mac上运行Windows Apps /游戏
- 【航空订票系统——开题报告 分享(仅供参考呀)】
- 脚本、脚本语言、写脚本都是什么呀???
- geoserver发布shp格式的图层 实现步骤(含图).doc
- Qnap威联通NAS数据丢失恢复方法
- Graylog单机版安装,Graylog安装脚本一键实现在线离线安装
- 三层交换机实现vlan间通信
- xml引入另一个xml文件_什么是XML文件(以及如何打开一个XML文件)?
- 微信开放平台--》网站应用开发 微信登录网站接口(https://open.weixin.qq.com/)
- 如何实现ArrayList的线程安全
- office中为何还要保留Access数据库? 【3500人回复】知乎
- 计算机程序默认打开方式怎么选,电脑不能选择打开方式怎么办|打开方式无法选择的解决方法...
- koa 洋葱模型的简单实现
- 如何自学directx
- 你的福利是咋被百度云盘给和谐的
- 【转】2008年.Net编程人员工具参照