学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. ...
随机推荐
- angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation
今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- Kooboo CMS技术文档之二:Kooboo CMS的安装步骤
在IIS上安装Kooboo CMS Kooboo CMS安装之后 安装的常见问题 1. 在IIS上安装Kooboo CMS Kooboo CMS部署到正式环境相当简单,安装过程是一个普通MVC站点在I ...
- Spring Enable annotation – writing a custom Enable annotation
原文地址:https://www.javacodegeeks.com/2015/04/spring-enable-annotation-writing-a-custom-enable-annotati ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- JAVA构造时成员初始化的陷阱
让我们先来看两个类:Base和Derived类.注意其中的whenAmISet成员变量,和方法preProcess(). 情景1:(子类无构造方法) class Base { Base() { pre ...
- Web开发安全之文件上传安全
很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...
- window7系统怎么找到开始运行命令
右击开始->属性->开始菜单->自定义>点击运行命令(选择)->确定
- 初探java中this的用法
一般this在各类语言中都表示“调用当前函数的对象”,java中也存在这种用法: public class Leaf { int i = 0; Leaf increment(){ i++; retur ...
- Centos 6.6 下搭建php5.2.17+Zend Optimizer3.3.9+Jexus环境
(为何安装php5.2.17这个版本 因为phpweb这个程序用到了Zend Optimizer3.3.9 这个东东已经停止更新了 最高支持5.2版本的php 所以就有了一晚上填坑的自己和总结了这篇文 ...