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++)相关推荐

  1. Java设计模式:观察者模式

    观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 如果这句话不好理解 可 ...

  2. 观察者模式的经典应用(猫叫 烧开水)

    Code 猫叫了 老鼠跑 主人惊醒  1/**//*  2 * 题目:  3 * 猫叫了,所有老鼠开始逃跑,主人被惊醒,请用OO的思想描绘此过程  4 * 1,老鼠跟主人是被动的  5 * 2,要考虑 ...

  3. Observer Pattern 观察者模式

    Observer Pattern (观察者模式) 定义: <设计模式>中对Observer模式的意图是这样描述的:"定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, ...

  4. 设计模式之观察者模式(Observer)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. java观察者模式_Java设计模式之观察者模式详解

    观察者模式,是一对多的关系,一个主题对应多个观察者,当这个主题发生变化的时候,所有观察着这个主题的观察者都会接收到通知来获悉主题的变化. 在现实中我们也会遇到许许多多应用观察者模式的行为,比如电视的节 ...

  6. python 设计模式 观察者_python设计模式之观察者模式

    说到观察者模式,在我脑海中总是闪现,这家伙跟消息队列的主题发布订阅有什么关系,虽然本人对消息队列没有很深的研究,但是凭直觉我就认为消息队列的实现就使用了观察者模式吧,所以本文就来模拟消息队列的丐版实现 ...

  7. JS设计模式-观察者模式

    观察者(又称发布订阅)模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 原文链接 应用场景 当用户在网页执行一些操作(如点击)后就需要执行 ...

  8. 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现

    1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject {publi ...

  9. 步步为营-44-窗体之间传值--观察者模式

    说明 :观察者模式又叫发布-订阅模式,其中又涉及到中介者模式 1 结构 2 创建Main窗体(中介者),ChildForm1(发布者),ChildForm2(订阅者),ChildForm3(订阅者), ...

  10. 观察者模式的Java实现及应用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Turwe www.jianshu.com/p/1025f6 ...

最新文章

  1. SAP MM 采购发票上的金额小差异
  2. 题目1154:Jungle Roads
  3. Linux Performance Observability Tools
  4. hdu 2094 “产生冠军”——set容器的应用
  5. wineskin使用教程_使用Wineskin在Mac上运行Windows Apps /游戏
  6. 【航空订票系统——开题报告 分享(仅供参考呀)】
  7. 脚本、脚本语言、写脚本都是什么呀???
  8. geoserver发布shp格式的图层 实现步骤(含图).doc
  9. Qnap威联通NAS数据丢失恢复方法
  10. Graylog单机版安装,Graylog安装脚本一键实现在线离线安装
  11. 三层交换机实现vlan间通信
  12. xml引入另一个xml文件_什么是XML文件(以及如何打开一个XML文件)?
  13. 微信开放平台--》网站应用开发 微信登录网站接口(https://open.weixin.qq.com/)
  14. 如何实现ArrayList的线程安全
  15. office中为何还要保留Access数据库? 【3500人回复】知乎
  16. 计算机程序默认打开方式怎么选,电脑不能选择打开方式怎么办|打开方式无法选择的解决方法...
  17. koa 洋葱模型的简单实现
  18. 如何自学directx
  19. 你的福利是咋被百度云盘给和谐的
  20. 【转】2008年.Net编程人员工具参照

热门文章

  1. etcd raft library设计原理和使用
  2. javascript之变量
  3. 蓝桥杯 参考题目 黄金队列(水题)
  4. 存储程序(1)——MYSQL
  5. 报错:不是可以识别的内置函数名称
  6. HttpContext(三)-Request
  7. 思考设计模式在自助终端软件上的应用 ——Observer(观察着)模式
  8. 尝试修改源码需要用到git存一下
  9. JavaScript --- [学习笔记] 原型模式
  10. iOS 快速实现分页界面的搭建