1、 观察者模式
又叫发布——订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听
某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象。这个主题对象在状态发生变化时,同会通知所有观察者对象,使它们能够自动更新自己。
结构图如下:
Subject类,它把所有观察者对象的引用,保存在一个聚集里,每个subject都可以任何数量的观察者。抽象subject提供一个接口可以增加和删除观察者对象。
Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到Subject的通知时更新自己。
ConcreteSubject类,具体Subject,将有关状态存入具体观察者对象;在具体主题的内部改变时,给所有登记过的观察者发出通知。
ConcreateObserver类,具体观察者,实现抽象观察者较色所要求的更新接口,以便使本身的状态与subject的状态相协调。
2、 观察者模式的特点
当一个对象的改变要同时改变其他对象,且它不知道具体有多少对象等待改变时,应该
考虑使用观察者模式。
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自地独立地改变和复用。
3、事件委托
虽然,观察者模式消除了通知者和观察者的直接依赖,但是它们还是相互依赖对方的抽象(抽象观察者和抽象通知者),而且,观察者必须要实现“更新”接口。这样如果,其中的一方如抽象观察者一旦不再存在,抽象通知者便无法通知下去。而在编程中经常有通知者和观察者之间就根本不知道对方,这样,如果由客户端来决定通知谁就好了——事件委托就可以实现。
委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何的方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的“类”,委托的实例将代表一个具体的函数。
一个委托可以搭载多个方法,所有方法被依次唤起,更重要的是它可以使委托对象所搭载的方法并不需要同属于一个类。
但是委托也是有前提的,那就是委托对象所搭载的所有方法必须具有相同的原型和形式,也就是拥有相同的参数列表和返回类型。