很感谢《Head First 设计模式》的作者!专业不古板,生动的用例子去解释每个设计模式,并模拟有相同点的设计模式以对话的形式出现在各章节。分别介绍自己的用途!让我加深对它们的理解!下面是我学到得第二个设计模式,观察者模式,也就是《Head First 设计模式》
第二章
观察者(Observer)模式
定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
问题1:这和一对多的关系有何关联?
答:得用观察者模式,主题是具有状态的对象,并且可以控制这些状态。也就是说,有“有一个”具有状态的主题。另一方面,观察者使用这些状态,虽然这些状态不属于他们。有许多的观察者,依赖主题来告诉他们状态何时改变了。
问题2:其间的依赖是如何产生的?
答:因为主题是真正拥有数据的人,观察者是主题的依赖者,在数据变化时更新,这样比起让许多对象控制同一份数据来,可以得到更干净的OO设计。
设计原则:为了交互对象之间的松耦合设计而努力。
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间互相依赖降到了最低。
松耦合就是当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。
观察者模式提供了一种对象设计,让主题和观察者之间松松耦合。
为什么呢?
因为在观察者模式中,主题只知道观察者实现了某个接口。主题不需要知道观察者的具体类是谁、做了些什么或其他任何细节。任何时候我们都可以增加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们可以随时增加观察者。当有新的观察者出现时,主题的代码不用修改。所有做的就是在新的类里实现此观察者的接口,然后注册为观察者既可。主题不在乎别的,它只会发送通知给所有实现了观察者接口的对象。
下面用代码去实现一个小型的气象站,当气象站更新时,通知所有的布告版!并显业出来!
思考思路:小型的气象站中的数据应该是不变的,然后布告版中的数据将会不同。一个气象站会通过多个布告版去显示气象信息,正符合了观察者模式中的一对多关系!然后像气象站中的状态却是会改变的,当气象站的信息更改时并要通知所有的布告版同时做出更新!
因为这样,所以我们可以把气象站当做一个主题,然而所有的布告版,我们全作为观察者。
如果观察者想要得到信息,就应该先向气象站注册。
但是还要我们注意的是,不同的观察者都有差异,所以我们需要一个共同接口的原因,好让主题可以把本身的数据传送给他们!
发现问题的所在了,代码日后补上!
总结:
1. 观察者模式定义了对象之间的一对多的关系。
2. 主题(也就是可以观察者)用一个共同的接口来更新观察者。
3. 观察者和可观察者之间用松耦合方式结合(loosecoupl.ing),可观察者的细节,只知道观察者实现了观察者接口。
4. 使用此模式时,你可从被观察者处推(push)或拉(pull)数据(然而,推的方式被认为更正确)。
5. 有多个观察者时,不可以依赖特定的通知次序。
6. JAVA有多种观察者模式的实现,包括了通用的java.util.Observable.
7. 要注意java.util.Observable实现上所带来的一些问题。
8. 如果有必要的话,可以实现自己的Observable,这并不难,不要害怕。
9. Swing中大量使用观察者模式,许多GUI框架也是如此
10.此模式也被应用在许多地方,例如JavaBeans、Rml。