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)模式
认识观察者模式 我们用报纸和杂志的订阅为例来介绍: 报社的业务就是出版报纸. 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来.只要你是他们的订户,你就会一直收到新报纸. 当你不想再看报纸的时候 ...
随机推荐
- Hexo+NextT第三方服务调用【4】
该系列博客列表请访问:http://www.cnblogs.com/penglei-it/category/934299.html 摘要 静态站点与动态站点有很大的不一样,它拥有一定的局 ...
- Android第二天
1.从看得见的活动入手 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ...
- [UWP小白日记-10]程序启动屏(ios解锁既视感)
讲一下 微软爸爸的开发者大会2016又暴了个表达式动画和Windows.UI.Composition的API,好叼的样子. 官方示例库GitHub 目前是懵逼状态,好复杂.脑细胞已经在地府排队了. ( ...
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001 I Count Two Three
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Android Tips
(1).设置图片缓存大小,一般可以设置为内存的1/8 int memoryCache = (int) (Runtime.getRuntime().maxMemory() / 8); (2). (3). ...
- ng1 http 读取json数据
在前端开发过程中,有时后端还没开发出接口,需要经常自己构造获取本地mock数据. AngularJS XMLHttpRequest $http 是 AngularJS 中的一个核心服务,用于读取远程服 ...
- C# 修改iframe url
一.修改本级的iframe url 首先在js中编写函数: <script type="text/javascript"> function reloadfrm2() ...
- nginx如何配置网页错误页面
首先要在http模块中加入 fastcgi_intercept_errors on; 其次要在server模块中加入 error_page 403 404 /40x.html; location = ...
- arm指令集
http://blog.chinaunix.net/uid-20769502-id-112445.html
- express mongoose 新手上路 问题记录
1.npm start启动报错,提示端口占用 app.js中添加了app.listen(3000),删掉即可 2.跳转到html页面 //ejs改为html app.engine('.html', r ...