观察者模式(Observer):定义一种一对多的依耐关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
白话:当类A的改变引起多个类B,C,D的改变,则可以将A类设置成被观察者;B,C,D则为观察者;被观察者提供通知、注册观察者,反注册观察者的方法。观察者提供更新的方法。
角色:(1)观察者:观察被观察者,收到被观察者的通知,更新。
(2)被观察者:注册观察者观察自己,反注册观察者取消观察。有变化时通知观察者。
注意:(1)观察者与被观察者通信,应避免类与类之间的直接调用,无论观察者观察对象,还是被观察者通知观察者。正确的做法应该像上图哪像针对与接口之间的通信。而不是ConcreteSubject与ConcreteObserver之间互调。
(2)上图中其实还存在着问题:①“抽象的被观察者”和“抽象的观察者”之间存在着耦合,“抽象被观察者”依赖于“抽象观察者”。②如果观察者没有抽象观察者相同的方法,则抽象被观察者无法通知观察者。
这里C#中的委托可以解决这个问题:
现实过程中,很多观察者因为封装的原因没有共同的基类,所以这里不继承Observer类
观察者StockObserver更新方法为:CloseStockMarket
观察者NBAObserver,更新方法为:CloseNBADirectSeeding
抽象被观察者:
定义一个委托类:
在具体的被观察者中定义一个委托变量:
客户端,为委托类增加对象的方法
总结:委托把观察者的注册和更新放到了客户端,降低了抽象观察者和抽象被观察者的耦合性。java暂时没有委托,因此耦合性还是无法避免。