今天来写一下观察者模式,文章内容主要是对大话设计模式这本书的整理。
1.观察者模式定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
2.问题引入
- 员工小a,小b,小c,放弃内卷,决定摸鱼,但又担心老板发现。
- 员工小d是公司前台,于是小a,b,c寻求小d帮助,一旦老板来公司,就第一时间通知他们。
设计一个结构,实现这一需求。
3.问题分析
- 前台小d可以看作一个发布者【publish】,而小a,小b和小c则相当于是一个观察者【observer】。
- 当小d观察到老板回来时(状态发生变化),此时通知小a,小b和小c执行各自的update()方法
4.代码实现
通知者:
观察者:
代码运行:
5.总结
5.1 观察者模式适合哪些情况?
当一个对象的改变需要同时改变其它对象,并且不知道具体有多少对象有待改变时应该考虑用观察者模式。
5.2 观察者模式的好处?
避免了为维护一致性而导致的紧密耦合,为维护、扩展和重用带来了方便.
5.3 观察者模式缺点?
抽象通知者依旧依赖抽象观察者,一旦没有抽象观察者,就无法实现自身的update功能。
并且每个具体观察者并不一定是 update 方法的调用,如果需要调用观察者的其它方法,就难以实现。
观察者模式的这些缺点,我们可以使用事件委托来克服。
6.延申-事件委托
6.1 使用委托优化观察者模式的缺点
当观察者有各自不同的功能需求时,代码如下:
使用委托来实现通知的功能,首先声明一个委托:
delegate void EventHandler();
创建通知者类:
功能实现:
6.2 委托介绍
- 委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
- 委托方法的使用可以像其它任何方法一样,具有参数和返回值。
- 委托可以看作是对函数的抽象,是函数的’类’,委托实例将代表一个具体的函数。
- 一个委托可以搭载多个方法,所有方法依次唤起。并且可以使委托对象所搭载的方法并不需要同属于一个类。
- 委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。
参考:
- 《大话设计模式》 -作者: 程杰 出版年: 2007-12-1 出版社: 清华大学出版社