前言

前两天学习了weak_ptr以后还是不甚明了,一则需要实际应用去锤炼,二来就是不懂观察者模式。

正文

观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,这个主题对象在状态发生改变时,会通知所有的观察者对象,使他们能够自动更新自己。 通过一张visio的UML图片介绍一下子功能关系。

subject类:抽象通知者类,一般用一个抽象类或者接口实现,把所有对观察者的引用都放到一个集合里,每个抽象通知者类可以有任意数量的观察者,抽象通知者类提供一个接口,可以增加或者删除观察者对象。

observer类:为所有的具体观察者类定义了一个接口,在得到通知者类的通知时更新自己,这个方法叫更新接口,抽象观察者一般用一个抽象类或者接口实现,更新接口通常包括update方法。

concretesubject类:具体通知者类,将有关状态放入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发送通知,通常用一个子类实现。

concreteobserver类:具体观察者,实现具体观察者所要求的更新接口,以便本身的状态与通知者状态相协调,具体观察者对象可以保存一个指向具体通知者对象的引用,通常用一个具体子类实现。

特点

对相互依赖的类进行改进,降低不同类之间的耦合性,尤其是多个对象的改变依赖一个对象的改变时,而且不知道有多少个对象依赖于某一个对象时,观察者模式将依赖和被依赖的对象独立起来,分别改变和复用;观察者对象让耦合的双方依赖于抽象,而不是依赖于具体,依赖于具体的意思就是如果新增一个类,就要修改所有的相关类。

对观察者模式的补充

根据大话设计模式的说法,观察者模式有一些不足之处,通知者过于依赖观察者,如果通知者不知道观察者有哪些,就无法调用notify来遍历更新观察者,就此引入一种通知者并不知晓观察者存在的观察者模式。

这种模式下通知者不再关心观察者,即没有了attach和deatch接口,观察者也失去了抽象接口update;通知者注册事件触发时观察者所需调用的函数集合,当事件触发时调用已注册的函数进行通知。

心得

观察者模式乍看挺复杂的,研究文字意思一时间没有搞懂,动手画了一个visio的UML图后秒懂有木有,学而不思则罔,思而不学则殆,天天爱学习。

【C++深入浅出】设计模式学习之观察者模式的更多相关文章

  1. 设计模式学习之“观察者模式” [C#]

    <深入浅出设计模式>学习笔记第二章 需求: 开发一套气象监测应用,如图: 气象站,目前有三种装置,温度.湿度和气压感应装置. WeatherData对象追踪气象站的数据,并更新到布告板,布 ...

  2. Java设计模式学习记录-观察者模式

    前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...

  3. 设计模式学习之观察者模式(Observer,行为型模式)(7)

    1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3 ...

  4. php设计模式学习之观察者模式

    什么都不说,先看代码: interface userOperateImpl { public function operate($username); } class userLoginLog imp ...

  5. Java-马士兵设计模式学习笔记-观察者模式-模拟Awt Button

    一.概述 Java 的Awt是 Observer模式,现用Java自己模拟awt中Button的运行机制 二.代码 1.Test.java import java.text.DateFormat; i ...

  6. Java-马士兵设计模式学习笔记-观察者模式-AWT简单例子

    1.AWT简单例子 TestFrame.java import java.awt.Button; import java.awt.Frame; import java.awt.event.Action ...

  7. Java-马士兵设计模式学习笔记-观察者模式-读取properties文件改成单例模式

    一.概述 1.目标:读取properties文件改成单例模式 二.代码 1.Test.java class WakenUpEvent{ private long time; private Strin ...

  8. Java-马士兵设计模式学习笔记-观察者模式-OOD 封装Listener

    一.概述 childe类中的是关联监听者dad的,若要再增加监听者,会很不方便,且要修改代码.好的方法是封装监听者类,用addListener()方法动态添加监听者 二.代码 1.Test.java ...

  9. Java-马士兵设计模式学习笔记-观察者模式-OOD 封装event

    把小孩醒来时的具体情况封装成事件类 Test.java class WakenUpEvent{ private long time; private String location; private ...

随机推荐

  1. 转:数据包经由路由转发时源、目的IP地址及MAC地址变化情况

    数据包经由路由转发时源.目的IP地址及MAC地址变化情况.  IP数据包经由路由转发的时候源ip,目的ip,源MAC,目的mac是否发生改变,如何改变?   A—–(B1-B2)—–(C1-C2)—— ...

  2. Maven中的一点疑惑的地方

    我们建立一个Maven项目,其结构如下:

  3. xml--通过jdom解析及生产XML

    JDOM是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序.它的设计包含 Java 语言的语法乃至语义. JAXP (用于 XML 语法分析的 Java API)包含了三个软 ...

  4. 深入理解memcached

    网上有5篇介绍memcached的文章,写的挺好,这里转过来. memcached完全剖析–1. memcached的基础 memcached全面剖析–2.理解memcached的内存存储 memca ...

  5. bzoj4511: [Usaco2016 Jan]Subsequences Summing to Sevens

    前缀和. 设f[i]为前缀和%7=i的第一个点.那么答案就是max(i-f[s[i]%7])了. #include<cstdio> #include<algorithm> #i ...

  6. 在Linux上运行C#

    众所周知,C#是Microsoft推出的.NET语言,只能在.NET平台上运行,例如Win 9x.ME.NT.2000.XP和Win CE之类的操作系统.但是,现在却有了一个叫做Mono的项目,它的目 ...

  7. UVa 1152 (中途相遇法) 4 Values whose Sum is 0

    题意: 要从四个数组中各选一个数,使得这四个数之和为0,求合法的方案数. 分析: 首先枚举A+B所有可能的值,排序. 然后枚举所有-C-D的值在其中用二分法查找. #include <cstdi ...

  8. WCF 服务调用RFC 出现异常

    我在VS2010的WCF项目用connecter 3.0 调用 RFC  运行到       IDestinationConfiguration ID = new SAPConfig();       ...

  9. [VC6]ONMESSAGE()宏编译时出现"sytax error ;"错误时

    自定义消息时编译出错,经排查,在定义消息的头文件里 #define WM_XXX (WM_USER+1000); 最后多加了一个分号引起. 吐血.

  10. iOS application: how to clear notifications?

    http://stackoverflow.com/questions/8682051/ios-application-how-to-clear-notifications up vote105down ...