观察者模式(发布订阅)
本文参考:headfirst设计模式、设计模式、维基百科。
导例:以订阅报纸为例,你在日报社订阅了“日报”,每天日报社印完了报纸(当然这个时间每天是无法十分精确的)就给你送到家(或者送到你家附近的经销点,你下班可以去拿),这就是一个简单的观察者模式,报社和读者是一对多的依赖关系,但是以报纸为信息媒介,二者却互不影响了(报社任何时间可以发布任何信息,只有形式受限——必须印在报纸上;而读者多少如何跟不受影响了),这相当于剥离了依赖关系中的变化部分。
定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。这种通知消息的传递可以是“推送”,也可以是“拉取”,两种方式有自己各自的特点。
设计原则:1.找出程序中会变化的方面,然后将其和固定不变的方面相分离。
2.为了交互对象之间的松耦合设计而努力
观察者模式的实现很灵活,应该满足的简单模式如下:
如上图所示:观察者调用主题的register方法,将观察者加入主题的订阅列表,当主题信息改变的时候,调用观察者的update方法,将数据传输给观察者,同样这个update方法可以在主题中实现,让观察者调用,这样就实现了拉的形式。
当然,Java为观察者模式提供了内置的支持
interface Observer updata();
public class Observable extends Object
缺点:Observable是一个类而不是接口,违反了原则,直接面向实现编程,可扩展性差,所以还是尽量自己实现。
为了方便使用和学习,做了简单的代码示例: