前言

前两天学习了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. linux系统相关的任务[fg、bg、jobs、&、ctrl + z]

    转自: http://blog.chinaunix.net/space.php?uid=20697318&do=blog&id=1891382 fg.bg.jobs.&.ctr ...

  2. 基于redis实现的分布式锁

    基于redis实现的分布式锁 我们知道,在多线程环境中,锁是实现共享资源互斥访问的重要机制,以保证任何时刻只有一个线程在访问共享资源.锁的基本原理是:用一个状态值表示锁,对锁的占用和释放通过状态值来标 ...

  3. Linux 下shell显示-bash-4.1$不显示用户名路径的解决方法

    Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法   问题描述:   CentOS下新增一个用户,登录进去之后shell脚本的信息如下:     而不是我们经常看 ...

  4. NFC(6)NFC编程的几个重要类,NFC硬件启动android应用原理

    用于NFC编程的几个重要类 Tag NFC 标签 NfcAdapter Nfc 的适配类 NdefMessage 描述NDEF格式的信息 NdefRecord 描述NDEF信息的一个信息段,类似tab ...

  5. 判断浏览器类型-----------navigator.userAgent.indexOf()

    <script language="JavaScript"> <!-- function getOs() { var OsObject = "" ...

  6. 更新Windows ActiveX,Ios

    两天内连续更新Windows ActiveX,和IOS两个平台. Windows ActiveX更新主要是添加加密流在线播放支持. IOS是优化渲染视频. Windows ActiveX 相关地址:h ...

  7. vijosP1026毒药?解药?

    hash. 怎么感觉叫状态压缩bfs比较合适呢? #include<cstdio> #include<algorithm> #include<cstring> us ...

  8. HNOI2008玩具装箱 (斜率优化)

    总算A了,心情好激动…… 如果会了一类斜率优化,基本上这类题就成了套模版了…… 只是k函数不同 var n,l,x,tail,head,m:int64; i,j:longint; dp,q,s:..] ...

  9. 更改nginx默认的网页目录

    默认网站根目录为/usr/local/nginx/html,要将它改成/homw/www vi /usr/local/nginx/conf/nginx.conf 将其中的           loca ...

  10. toastr

    $(function(){     //参数设置,若用默认值可以省略以下面代     toastr.options = {         "closeButton": false ...