设计模式故事——观察者模式

2 观察者模式

工厂模式搞定了篮球种类灵活拓展,抽象工厂保证了篮球原料质量,有了许多家篮球专卖店开始销售小佑的篮球。

一些专卖店店主们制作了篮球屏幕展示,希望小佑的篮球款式更新时马上通知他们更换。

简单!只要我在篮球类修改时,通知每一个专卖店店主即可。
但是!专卖店店主并不是永久合作的,有时会增加专卖店,有时还会减少,篮球类岂不是要经常改动?
这哪行啊!
设计原则:保证交互对象之间的松耦合。(不能让篮球对象过渡依赖它的专卖店,否则会频繁修改)

使用观察者模式试一下。

让篮球类实现主题接口,一个主题可以有许多观察者,存储在一个观察者的ArrayList中,并且提供注册和注销方法。
让专卖店类实现观察者接口,接口有一个update方法,当主题改变时被调用,更新新的主题内容。
如果专卖店想实时关注篮球类的变化,就向篮球类注册,存储在arrayList中,不再关注就注销删除。
当篮球类的内容改变时,都调用自身的notifyObservers方法,在方法中通知ArrayList中每一个观察者更新的内容(通过调用Observer.update)。

问题完美解决! 而且,看起来篮球类并不关注观察者是专卖店还是废品回收站,只要实现了观察者接口并且注册,就会再更新内容的时候通知它,如果有一天,废品回收站对我的篮球感兴趣,也可以实现观察者接口,注册进来。有点方便,这波大赚。

总结

观察者模式定义了对象之间的一对多的依赖关系,一个对象改变状态,通知依赖它的对象。主题用约定好的一个接口来更新观察者,观察者和主题之间松耦合,不必知道观察者的实现细节,只要实现了观察者接口即可。
观察者模式实际上可以通过“推”和“拉”两种方式传递数据。(推的方式似乎被认为更正确)

设计原则:找出程序中变化的部分,和不变的部分相分离。
设计原则:针对接口编程,不针对实现编程。(松耦合)
设计原则:多用组合,少用继承。

猜你喜欢

转载自blog.csdn.net/tianyouououou/article/details/106216935