首先提出问题:设计一个方案实现报社内容更新和杂志订阅者被通知。
在这里我们可以把报社看做“主题”,订阅者看做“观察者”。他们之间的关系如下图:
因此我们可以得到,主题对象有以下的能力:
一、可以更新自己的内容,并通知观察者对象。
二、可以允许添加和移除观察者对象。
观察者有以下的功能:
一、获得主题对象的更新,用以满足自己的需求。
二、要求主题将自己移除或者注册。
根据上面的功能需求,我们可以设计出观察者模式的类图:
我们在接口Subject中声明了registerObserver()和removeObserver()以及notifyObserver()。通过ConcreteSubject对象来实现这三个方法。
同样我们在接口Observer中声明了update()方法,在ConcreteObserver对象中实现该方法。
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
关于观察者的一切,主题只知道观察者实现了某些接口,而不知道观察者的具体类是谁,做了什么实现。
当对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。
我们又可以得到一条设计原则:
设计原则:为了交互对象之间的松耦合设计而努力。
这就是观察者模式:
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。
最后说一下,Java中内置的观察者模式。
jJava内置的观察者模式中,通知的方式有两种。
第一种是推(push)。
第二种是拉(pull)。
这两种方式根据自己的需要选取其一。
java.util.Observable中有两个问题需要注意:
第一、Observable是一个类,不是接口,所以只能用继承的方式实现,这就限制了它的复用性。
第二、其中的setChanged()方法是被保护起来的(被定义为protected)。这就意味着我们只能继承不能用组合。这同样违反了在策略模式中谈过的“多用组合,少用继承”的原则。
以上就是观察者模式的内容。