一、借鉴说明

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)观察者模式的更多相关文章

  1. 学C#之设计模式系列笔记(1)策略模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...

  2. javaScript 设计模式系列之一:观察者模式

    介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),一个目标对象管理所有相依于它的观察者对象.该模式中存在两个角色:观察者和被观察者.目标对象与观察者之间的抽象耦合关系能够单独扩展 ...

  3. Java设计模式学习笔记(观察者模式)

    观察者模式说起来很简单,就是一个订报纸的模式.但是实际上这部分我觉得还是很有意思的,<Head First设计模式>里还有一些还没看完,也是因为理解的不够深吧. 观察者模式会包含两个组件: ...

  4. HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern)

    观察者模式:定义了对象之间一对多的依赖关系,这样一来,当一个对象的状态发生改变时,它的依赖者将会受到通知并且自动更新. 有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事,对象甚至在运行时可以 ...

  5. 设计模式学习笔记——Observer观察者模式

    观察者模式里面有两个东西:观察者(Observer)和目标(Subject).当目标发生变化的时候,观察者随之起舞,也作出相应的变化.此为观察者模式. 这是怎么做到的?主要是目标里面存有一份观察者的名 ...

  6. 《动手学深度学习》系列笔记 —— 语言模型(n元语法、随机采样、连续采样)

    目录 1. 语言模型 2. n元语法 3. 语言模型数据集 4. 时序数据的采样 4.1 随机采样 4.2 相邻采样 一段自然语言文本可以看作是一个离散时间序列,给定一个长度为\(T\)的词的序列\( ...

  7. 《动手学深度学习》系列笔记—— 1.2 Softmax回归与分类模型

    目录 softmax的基本概念 交叉熵损失函数 模型训练和预测 获取Fashion-MNIST训练集和读取数据 get dataset softmax从零开始的实现 获取训练集数据和测试集数据 模型参 ...

  8. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  9. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

随机推荐

  1. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  2. PHP之用户验证和标签推荐的简单使用

    本篇主要是讲解一些最简单的验证知识 效果图 bookmark_fns.php <?php require_once('output_fns.php'); require_once('db_fns ...

  3. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  4. 如何定位Oracle数据库被锁阻塞会话的根源

    首先再次明确下,数据库因为要同时保证数据的并发性和一致性,所以操作有锁等待是正常的. 只有那些长时间没有提交或回滚的事物,阻塞了其他业务正常操作,才是需要去定位处理的. 1.单实例环境 2.RAC环境 ...

  5. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy

    本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...

  6. ntp

    一: 在一台可以连接外网的服务器A上配置ntp: 配置  /etc/ntp.conf  文件: server 202.120.2.101            # local clock (LCL) ...

  7. Javascript高性能编程-提高Dom访问速度

    在浏览器中对于Dom的操作和普通的脚本的操作处于两个不同的dll中,两个dll的交互是比较耗时的,优化对Dom的操作可以提高脚本的执行速度.下面是对如何优化的一些总结: 将需要多次操作的节点存储在一个 ...

  8. linux下安装Redis以及phpredis模块

    一:redis的安装 1. 首先上官网下载Redis 压缩包,地址:http://redis.io/download 下载 2. 通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作 3. ...

  9. 解决Ubuntu Kylin 1610安装ANSYS17.2的NVIDIA显卡驱动问题

    Ubuntu Kylin 1610在安装完毕后,会自动安装显卡驱动,对于一般的图形图像使用来说自然不会有太大的问题,但是对于ANSYS17.2的一些模块,还是会出现问题.一个比较常见的问题就是Open ...

  10. 使用Metrics.NET 构建 ASP.NET MVC 应用程序的性能指标

    通常我们需要监测ASP.NET MVC 或 Web API 的应用程序的性能时,通常采用的是自定义性能计数器,性能计数器会引发无休止的运维问题(损坏的计数器.权限问题等).这篇文章向你介绍一个新的替代 ...