学C#之设计模式系列笔记(2)观察者模式
一、借鉴说明
1.《Head First Design Patterns》(中文名《深入浅出设计模式》)
2.维基百科,观察者模式,https://zh.wikipedia.org/wiki/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F
3.MSDN,event(C#参考),https://msdn.microsoft.com/zh-cn/library/8627sbea.aspx
二、观察者模式
- 基础知识
提供一个被观察者(数据库、通知中心等),多个观察者注册到该被观察者上,当观察者关心的数据改变的时候,被观察者会通知各个观察者。被观察者可以将数据主动地传给观察者(推方式)或者观察者在接到通知后主动向被观察者获取数据(拉方式)。
- 具体例子
现如今,用户可以通过邮箱订阅各式各样的周刊,而负责这些周刊的出版社会定时地将周刊发送到用户的邮箱,这些周刊的版面都是分为两种,一种是头条(即出版社特别推荐给用户的,有详尽说明的内容),一种是链接群(就是一些摘要的、附有超链接的内容,用户如果有兴趣的话,可以进而点击超链接了解详情)。如果用户想要每周获得指定出版社的周刊,就需要首先在该出版社上进行注册,如果想订阅多个出版社的周刊,则需要在各个出版社上都进行注册。当然,用户都有权利取消订阅。
这里,用户User就是观察者Observer,出版社Press就是被观察者Observable,User订阅了某Press的周刊就是注册register,User取消订阅就是注销remove,定时发送周刊就是通知notify,而头条就是推方式push,即Press主动推送数据给User的情况,链接群就是拉方式pull,即接到通知后,User主动向Press获取数据的情况。因此,Press就有了registerObserver函数(添加观察者)、removeObserver函数(移除观察者)、updateImportantContent函数("推方式"推送头条)、updateHyperlink函数("拉方式"发送链接),User就有了notifyPush函数("推方式"获得头条,各个User对头条的处理方式不尽相同)、notifyPull函数("拉方式"获得链接群,各个User对链接群的处理方式不尽相同)。User可以调用Press的registerObserver函数订阅周刊,调用removeObserver函数取消订阅周刊。UML如图所示。

如上图所示,为了保证Press的封装性,具体的是指updateImportantContent函数和updateHyperlink函数私有,以确保Press才有发出通知的权利(如若没有确保封装性,假设有一个心怀不轨的作者,只想让自己的作品独占整个周刊,那么他完全可能调用updateImportantContent函数和updateHyperlink函数达成自己的目的),但是这样,耦合度又太高了,所以笔者认为:针对C#,推荐使用event关键字实现观察者模式,具体的实现见下文。
- 什么时候可以考虑使用观察者模式
当一个对象依赖另一个对象的数据变化的时候,或者子线程异步操作完成后通知主线程的时候,可以考虑使用观察者模式。
- 具体的C#实现
设计模式(C#)的相关代码我都放在git上:https://github.com/MGKING3/DesignPatternsUseCSharp
我使用的是VS2015,是整一个项目,下载即可以用,不时更新。
如果使用不了git的话,百度云也是可以下载的,地址:http://pan.baidu.com/s/1bp7Txuf
望互相学习,谢谢
- 相关OO原则
1.封装原则
2.多用组合(has-a),少用继承(is-a)
3.尽量"面向接口"
4.追求"松耦合"
学C#之设计模式系列笔记(2)观察者模式的更多相关文章
- 学C#之设计模式系列笔记(1)策略模式
一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...
- javaScript 设计模式系列之一:观察者模式
介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),一个目标对象管理所有相依于它的观察者对象.该模式中存在两个角色:观察者和被观察者.目标对象与观察者之间的抽象耦合关系能够单独扩展 ...
- Java设计模式学习笔记(观察者模式)
观察者模式说起来很简单,就是一个订报纸的模式.但是实际上这部分我觉得还是很有意思的,<Head First设计模式>里还有一些还没看完,也是因为理解的不够深吧. 观察者模式会包含两个组件: ...
- HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern)
观察者模式:定义了对象之间一对多的依赖关系,这样一来,当一个对象的状态发生改变时,它的依赖者将会受到通知并且自动更新. 有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事,对象甚至在运行时可以 ...
- 设计模式学习笔记——Observer观察者模式
观察者模式里面有两个东西:观察者(Observer)和目标(Subject).当目标发生变化的时候,观察者随之起舞,也作出相应的变化.此为观察者模式. 这是怎么做到的?主要是目标里面存有一份观察者的名 ...
- 《动手学深度学习》系列笔记 —— 语言模型(n元语法、随机采样、连续采样)
目录 1. 语言模型 2. n元语法 3. 语言模型数据集 4. 时序数据的采样 4.1 随机采样 4.2 相邻采样 一段自然语言文本可以看作是一个离散时间序列,给定一个长度为\(T\)的词的序列\( ...
- 《动手学深度学习》系列笔记—— 1.2 Softmax回归与分类模型
目录 softmax的基本概念 交叉熵损失函数 模型训练和预测 获取Fashion-MNIST训练集和读取数据 get dataset softmax从零开始的实现 获取训练集数据和测试集数据 模型参 ...
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- 跟着鸟哥学Linux系列笔记3-第11章BASH学习
跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...
随机推荐
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- 重新认识了下Entity Framework
什么是Entity Framework Entity Framework是一个对象关系映射O/RM框架. Entity Framework让开发者可以像操作领域对象(domain-specific o ...
- Java 时间类-Calendar、Date、LocalDate/LocalTime
1.Date 类 java.util.Date是一个"万能接口",它包含日期.时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪 ...
- java面向对象中的关键字
1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...
- Flexible 弹性盒子模型之CSS flex-shrink 属性
实例 让第二个元素收缩到其他元素的三分之一: 效果预览 div:nth-of-type(2){flex-shrink:3;} 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. 紧跟在 - ...
- Flex 布局教程:实例篇
该教程整理自 阮一峰Flexible教程 今天介绍常见布局的Flex写法.你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我的主要参考资料是Landon Schropp的文章和Solved ...
- Android 指纹认证
安卓指纹认证使用智能手机触摸传感器对用户进行身份验证.Android Marshmallow(棉花糖)提供了一套API,使用户很容易使用触摸传感器.在Android Marshmallow之前访问触摸 ...
- 【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
前言 在之前介绍的流量劫持文章里,曾提到一种『HTTPS 向下降级』的方案 -- 将页面中的 HTTPS 超链接全都替换成 HTTP 版本,让用户始终以明文的形式进行通信. 看到这,也许大家都会想到一 ...
- 一步步搭建自己的博客 .NET版(2、评论功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...