event 实现观察者模式
看了一些其他人写的,一下就晕了,还是自己写一个给自己看吧。
用event语法糖实现的观察者,与普通的实现,最大的区别在于,Subject的操作中不会直接触发Observer的Update,而是通过event间接实现。
特别注意,标准的观察者模式中,Subject需要Attach所需的Observer,然后执行通知时,依次调用Observer的方法,而用event时,就是将Subject的event绑定所有要调用的Observer的行为,执行时,调用event即可。
1.最直接的版本如下。定义Subject的Notify,里面触发事件,事件调用绑定的Observer的方法。而绑定操作放到场景类的Main中实现。(ObserverA为子类,略了。)
public class Subject
{
public delegate void Notice();
public event Notice NoticeEvent; public void Notify()
{
Console.WriteLine("发送通知");
if (NoticeEvent != null)
NoticeEvent();
}
}
public class Observer
{ public virtual void Update()
{
Console.WriteLine("得到通知");
}
}
class Program
{
static void Main(string[] args)
{
var subject = new Subject();
var observer = new Observer();
var observerA = new ObserverA();
subject.NoticeEvent += new Subject.Notice(observer.Update);
subject.NoticeEvent += new Subject.Notice(observerA.Update);
subject.Notify();
}
}
2.进一步的设计,可以不暴露Observer的Update方法,通过一个包装的Bind方法来绑定二者。如下:
public class Subject
{
public delegate void Notice();
public event Notice NoticeEvent; public void Notify()
{
Console.WriteLine("发送通知");
if (NoticeEvent != null)
NoticeEvent();
}
}
public class Observer
{ public void Bind(Subject subject)
{
subject.NoticeEvent += new Subject.Notice(Update);
} protected virtual void Update()
{
Console.WriteLine("得到通知");
}
}
class Program
{
static void Main(string[] args)
{
var subject = new Subject();
var observer = new Observer();
var observerA = new ObserverA();
observer.Bind(subject);
observerA.Bind(subject);
subject.Notify();
}
}
3.如果考虑与以前的观察者模式的Attach方法一致,还可以在Subject中设计Attach方法,封装调用Observer的Bind,没有实际意义,只是保持接口一致。
event 实现观察者模式的更多相关文章
- 如何实现Application event,观察者模式
spring 事件为bean 与 bean之间传递消息.一个bean处理完了希望其余一个接着处理.这时我们就需要其余的一个bean监听当前bean所发送的事件. spring事件使用步骤如下: 1.先 ...
- C# 7.0 观察者模式 以及 delegate 和 event
观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还 ...
- 使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event
观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还 ...
- PHP 设计模式 笔记与总结(11)观察者模式
[观察者模式(Observer)]当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新 [场景]一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑. ...
- delegate 和 event
delegate 和 event 观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, ...
- 大型Java进阶专题(八)设计模式之适配器模式、装饰者模式和观察者模式
前言 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式. ...
- SpringBoot事件监听机制及观察者模式/发布订阅模式
目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...
- [GeekBand] 面向对象的设计模式(C++)(1)
一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. 这样,你就能一次又一次 地使用该方案而不必做重复劳动. 0. 从面向对象谈起 底层思维与抽象思维: 底层思维要求程序员&q ...
- HeadFirst学习笔记-2.观察者(Observer)模式
认识观察者模式 我们用报纸和杂志的订阅为例来介绍: 报社的业务就是出版报纸. 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来.只要你是他们的订户,你就会一直收到新报纸. 当你不想再看报纸的时候 ...
随机推荐
- 克隆虚拟机win8系统后注意修改安全标识(SID)
克隆虚拟机win8系统后注意修改安全标识(SID) 克隆虚拟机系统后两个系统硬件配置一样,需要注意修改:security ID ,MAC,计算机名,IP地址,产品激活 重置工具:sysprep.e ...
- 基于jQuery的ajax系列之用FormData实现页面无刷新上传
接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方 ...
- 当我们在谈论kmeans(5)
本系列意在长期连载分享,内容上可能也会有所删改: 因此如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/(暂时公式显示有问题) 其他: ...
- Linux系统下给非root用户添加sudo权限
Linux系统下给非root用户添加sudo权限 有时,在linux系统中非root用户运行sudo命令,会提示类似信息: xxx is not in the sudoers file. This ...
- oracle——用户
新增用户 用system用户登录 CREATE USER TEST1 IDENTIFIED BY TEST1; CREATE USER:创建用户命令,后跟用户名: IDENTIFIED BY:后跟密码 ...
- call 与 apply的区别
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- CrashMe分析教程1 - BreakPoint
首先,谢谢 Robert Kuster 为我们提供了这么好的CrashMe项目. 很多人想寻找一个CrashMe分析的教程, 我也想要, 但是似乎网络里没有, 所以我就决定用业余时间写一个小系列来共享 ...
- django 学习笔记(一)搭建基础环境
1.安装django 下载地址 https://github.com/django/django 解压后进入文件夹运行指令 >> python setup.py install 2.创建工 ...
- U3D音频系统
一.基本信息 1.支持的声音格式 WAV OGG MP3 AIFF MOD S3M xm IT 导入以后,unity会选择的压缩方式: WAV:无损,音质好,文件大,适用于较短文件 OGG.MP ...
- 免费SSL证书申请
https://buy.wosign.com/free/#apply 和 http://www.startssl.com/