前言

前两天学习了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. AC题目简解-dp

    dp类:A - Bridging signals ZOJ 3627 POJ1631 HDU1950给出一个从1-n的数字排列,求最长上升子序列长度.直接说解法吧.新开一个数组d,d[i]表示的是能构成 ...

  2. MySQL数据库乱码 - Linux下乱码问题一

    乱码问题是很让人抓狂的问题,下面我将记录一下linux下mysql乱码问题的解决方法. mysql在linux下乱码问题 一.操作 mysql默认字符集是latin1,但是我们大部分程序使用的字符集是 ...

  3. 微信支付开发1 微信支付URL配置

    本文介绍微信支付申请时如何设置授权目录及URL. 一.选择支付类型 目前有两种支付类型 JS API网页支付 Native原生支付 如果没有特殊要求,两种都勾选. 二.支付授权目录 目前可以选择htt ...

  4. Unable to open c

    1. Unable to open c:\Cadence\PSD_14.2\tools\capture\allegro.cfg for reading. Please correct the abov ...

  5. MarshalByRefObject浅析

    首先了解一下不同应用程序域中的对象的通信方式有两种: 一种是跨应用程序域边界传输对象副本 一种是使用代理交换消息. 简单来讲,继承此类的对象可以跨越应用程序域边界被引用,甚至被远程引用. 当一个对象需 ...

  6. 【HDOJ】4374 One hundred layer

    线性DP,使用单调队列优化. /* 4374 */ #include <iostream> #include <sstream> #include <string> ...

  7. 告诉你一个真实的OpenStack:都谁在用,用来干什么?

    告诉你一个真实的OpenStack:都谁在用,用来干什么? OpenStack基金会近日发布的双年调查报告显示,开源云计算软件OpenStack正在进入主流企业市场,但该项目依然面临较难部署和管理的老 ...

  8. IPC:Sockets

    Please refer to http://www.cs.cf.ac.uk/Dave/C/node28.html.

  9. [POJ 2420] A Star not a Tree?

    A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4058   Accepted: 200 ...

  10. P2P编程(十)

    此为网络编程的一个系列,后续会把内容补上....