【C++深入浅出】设计模式学习之观察者模式
前言
前两天学习了weak_ptr以后还是不甚明了,一则需要实际应用去锤炼,二来就是不懂观察者模式。
正文
观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,这个主题对象在状态发生改变时,会通知所有的观察者对象,使他们能够自动更新自己。 通过一张visio的UML图片介绍一下子功能关系。

subject类:抽象通知者类,一般用一个抽象类或者接口实现,把所有对观察者的引用都放到一个集合里,每个抽象通知者类可以有任意数量的观察者,抽象通知者类提供一个接口,可以增加或者删除观察者对象。
observer类:为所有的具体观察者类定义了一个接口,在得到通知者类的通知时更新自己,这个方法叫更新接口,抽象观察者一般用一个抽象类或者接口实现,更新接口通常包括update方法。
concretesubject类:具体通知者类,将有关状态放入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发送通知,通常用一个子类实现。
concreteobserver类:具体观察者,实现具体观察者所要求的更新接口,以便本身的状态与通知者状态相协调,具体观察者对象可以保存一个指向具体通知者对象的引用,通常用一个具体子类实现。
特点
对相互依赖的类进行改进,降低不同类之间的耦合性,尤其是多个对象的改变依赖一个对象的改变时,而且不知道有多少个对象依赖于某一个对象时,观察者模式将依赖和被依赖的对象独立起来,分别改变和复用;观察者对象让耦合的双方依赖于抽象,而不是依赖于具体,依赖于具体的意思就是如果新增一个类,就要修改所有的相关类。
对观察者模式的补充
根据大话设计模式的说法,观察者模式有一些不足之处,通知者过于依赖观察者,如果通知者不知道观察者有哪些,就无法调用notify来遍历更新观察者,就此引入一种通知者并不知晓观察者存在的观察者模式。
这种模式下通知者不再关心观察者,即没有了attach和deatch接口,观察者也失去了抽象接口update;通知者注册事件触发时观察者所需调用的函数集合,当事件触发时调用已注册的函数进行通知。
心得
观察者模式乍看挺复杂的,研究文字意思一时间没有搞懂,动手画了一个visio的UML图后秒懂有木有,学而不思则罔,思而不学则殆,天天爱学习。
【C++深入浅出】设计模式学习之观察者模式的更多相关文章
- 设计模式学习之“观察者模式” [C#]
<深入浅出设计模式>学习笔记第二章 需求: 开发一套气象监测应用,如图: 气象站,目前有三种装置,温度.湿度和气压感应装置. WeatherData对象追踪气象站的数据,并更新到布告板,布 ...
- Java设计模式学习记录-观察者模式
前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...
- 设计模式学习之观察者模式(Observer,行为型模式)(7)
1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3 ...
- php设计模式学习之观察者模式
什么都不说,先看代码: interface userOperateImpl { public function operate($username); } class userLoginLog imp ...
- Java-马士兵设计模式学习笔记-观察者模式-模拟Awt Button
一.概述 Java 的Awt是 Observer模式,现用Java自己模拟awt中Button的运行机制 二.代码 1.Test.java import java.text.DateFormat; i ...
- Java-马士兵设计模式学习笔记-观察者模式-AWT简单例子
1.AWT简单例子 TestFrame.java import java.awt.Button; import java.awt.Frame; import java.awt.event.Action ...
- Java-马士兵设计模式学习笔记-观察者模式-读取properties文件改成单例模式
一.概述 1.目标:读取properties文件改成单例模式 二.代码 1.Test.java class WakenUpEvent{ private long time; private Strin ...
- Java-马士兵设计模式学习笔记-观察者模式-OOD 封装Listener
一.概述 childe类中的是关联监听者dad的,若要再增加监听者,会很不方便,且要修改代码.好的方法是封装监听者类,用addListener()方法动态添加监听者 二.代码 1.Test.java ...
- Java-马士兵设计模式学习笔记-观察者模式-OOD 封装event
把小孩醒来时的具体情况封装成事件类 Test.java class WakenUpEvent{ private long time; private String location; private ...
随机推荐
- Python字符串编码问题
编码问题:Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了. ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节.字母A用ASC ...
- JavaScript DOM高级程序设计 4.3控制事件流和注册事件侦听器--我要坚持到底!
一.事件流 我们通过下面一个实例,进行说明. <body> <h1>Event Flow</h1> <ul id="nav"> &l ...
- 蓝牙(2)用BluetoothAdapter搜索蓝牙设备示例
注意在搜索之前要先打开蓝牙设备 package com.e.search.bluetooth.device; import java.util.Set; import android.app.Acti ...
- C#中的多文档的使用
1.首先,新建一个窗体,设置窗体的IsMdiContainer = true; 窗体的大小为700*600 长700 高600 2.在窗体的Load事件中添加如下代码 private void F ...
- php类 静态变量赋值 static $name="abc"
<?php class test { static $name="abc"; } echo test::$name; 1.巴斯科范式 class_statement: var ...
- html的视频插件 (转)
1)jMedia Element是一个基于jQuery/jQuery UI实现的HTML5音频/视频开发工具包.提供非常多的功能来控制页面中的音频和视频内容.当旧的浏览器不兼容HTML5时, ...
- 【转】iOS中16进制转10进制
原文网址:http://www.voidcn.com/blog/u012198553/article/p-4976772.html /// 将十六进制的字符串转化为NSData - (NSData ) ...
- 学习面试题Day02
1.Java的引用和C++的指针有什么区别? 1.类型:引用其值为地址的数据元素,Java封装了的地址,可以转成字符串查看,长度可以不必关心.C++指针是一个装地址的变量,长度一般是计算机字长,可以认 ...
- javascript六难题
1.下面代码的运行效果是什么?为什么? <html> <head> <meta charset="utf-8"> <title>DO ...
- C#数据上传方法
/// <summary> /// 连接成功后开始调用数据上传程序 /// </summary> public void CallDataUpload() { //指定上传日期 ...