学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. ...
随机推荐
- 带你实现开发者头条APP(四)---首页优化(加入design包)
title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...
- ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0
ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- var和dynamic的区别
1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- 装饰者模式 Decoration
1.什么是装饰者模式 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活.当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列 ...
- jquery.each()
$(selector).each(function(index,element)) index - 选择器的 index 位置 element - 当前的元素(也可使用 "this" ...
- 【干货分享】流程DEMO-采购预算编制
流程名: 采购预算编制 业务描述: 在月初由计财部进行预算编辑,提交审批后预算生效 流程相关文件: 流程包.xml WebService业务服务.xml WebService.asmx WebSe ...
- mac好用的markdown编辑器
在刚开始接触markdown的时候,就被吸引了.此后一直在找贴心的好用的markdown编辑器.印象笔记和马克飞象配合着用也是挺好的,唯一的缺点就是比较封闭,发个笔记的链接给同学,还得注册才能看,导致 ...
- [转载]MVVM模式原理分析及实践
没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...