设计模式之观察者模式

来源:互联网 发布:码畜 知乎 编辑:程序博客网 时间:2024/06/02 04:14

首先提出问题:设计一个方案实现报社内容更新和杂志订阅者被通知。


在这里我们可以把报社看做“主题”,订阅者看做“观察者”。他们之间的关系如下图:



因此我们可以得到,主题对象有以下的能力:

一、可以更新自己的内容,并通知观察者对象。

二、可以允许添加和移除观察者对象。

观察者有以下的功能:

一、获得主题对象的更新,用以满足自己的需求。

二、要求主题将自己移除或者注册。


根据上面的功能需求,我们可以设计出观察者模式的类图:


我们在接口Subject中声明了registerObserver()和removeObserver()以及notifyObserver()。通过ConcreteSubject对象来实现这三个方法。

同样我们在接口Observer中声明了update()方法,在ConcreteObserver对象中实现该方法。

观察者模式提供了一种对象设计,让主题和观察者之间松耦合。

关于观察者的一切,主题只知道观察者实现了某些接口,而不知道观察者的具体类是谁,做了什么实现。

当对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。

我们又可以得到一条设计原则:

设计原则:为了交互对象之间的松耦合设计而努力。


这就是观察者模式:

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。


最后说一下,Java中内置的观察者模式。

jJava内置的观察者模式中,通知的方式有两种。

第一种是推(push)。

第二种是拉(pull)。

这两种方式根据自己的需要选取其一。

java.util.Observable中有两个问题需要注意:

第一、Observable是一个类,不是接口,所以只能用继承的方式实现,这就限制了它的复用性。

第二、其中的setChanged()方法是被保护起来的(被定义为protected)。这就意味着我们只能继承不能用组合。这同样违反了在策略模式中谈过的“多用组合,少用继承”的原则。

以上就是观察者模式的内容。

1 0
原创粉丝点击