【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 ...
随机推荐
- sublime打开文件时自动生成并打开.dump文件
GBK Encoding Support 没有安装前打开ASNI格式编码文件会乱码,安装成功重启则可以打开正常 关于.dump文件生成的解释: 当打开一个非utf-8格式且包含汉字的文件时,subli ...
- mysql 查看表的类型
MySQL 数据表主要支持六种类型 ,分别是:BDB.HEAP.ISAM.MERGE.MYISAM.InnoBDB. 这六种又分为两类,一类是”事务安全型”(transaction-safe),包括B ...
- bzoj4511: [Usaco2016 Jan]Subsequences Summing to Sevens
前缀和. 设f[i]为前缀和%7=i的第一个点.那么答案就是max(i-f[s[i]%7])了. #include<cstdio> #include<algorithm> #i ...
- Entityframework常用命令
Enable-Migrations 启用Migration数据迁移 Add-Migration migrationname 添加一个migration Update-Database –TargetM ...
- I.MX6 U-boot PWM hacking
/******************************************************************************* * I.MX6 U-boot PWM ...
- 【jsonp】
function handleResponse(response) { alert("You’re at IP address " + response.ip + ", ...
- Java [leetcode 33]Search in Rotated Sorted Array
题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...
- andori 动画验证必填项
android项目开发过程中,都会碰到必填项的校验,最简单的就是利用Toast对用进行提示,感觉这种提示太不够人性化了,那么今天就来个带动画的,并可以将光标定位到必填项中. andorid动画Anim ...
- CSS布局中——导航是非常常见的
导航绝对是页面布局中最常见的,为了不用每次去写,稍微贴个简单的导航模版出来,方便以后使用. <title>CSS菜单</title> <style type=" ...
- 【转】AngularJS路由和模板
1. AngularJS路由介绍 AngularJS路由功能是一个纯前端的解决方案,与我们熟悉的后台路由不太一样.后台路由,通过不同的URL会路由到不同的控制器上(controller),再渲染(re ...