日拱一卒(三十二)

观察者模式(Observer):定义一种一对多的依耐关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

                                       白话:当类A的改变引起多个类B,C,D的改变,则可以将A类设置成被观察者;B,C,D则为观察者;被观察者提供通知、注册观察者,反注册观察者的方法。观察者提供更新的方法。

                                       角色:(1)观察者:观察被观察者,收到被观察者的通知,更新。

                                                  (2)被观察者:注册观察者观察自己,反注册观察者取消观察。有变化时通知观察者。   



              注意:(1)观察者与被观察者通信,应避免类与类之间的直接调用,无论观察者观察对象,还是被观察者通知观察者。正确的做法应该像上图哪像针对与接口之间的通信。而不是ConcreteSubject与ConcreteObserver之间互调。

                         (2)上图中其实还存在着问题:①“抽象的被观察者”和“抽象的观察者”之间存在着耦合,“抽象被观察者”依赖于“抽象观察者”。②如果观察者没有抽象观察者相同的方法,则抽象被观察者无法通知观察者。

这里C#中的委托可以解决这个问题:

现实过程中,很多观察者因为封装的原因没有共同的基类,所以这里不继承Observer类
观察者StockObserver更新方法为:CloseStockMarket

观察者NBAObserver,更新方法为:CloseNBADirectSeeding

抽象被观察者:

定义一个委托类:

在具体的被观察者中定义一个委托变量:

客户端,为委托类增加对象的方法

总结:委托把观察者的注册和更新放到了客户端,降低了抽象观察者和抽象被观察者的耦合性。java暂时没有委托,因此耦合性还是无法避免。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值