很感谢《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.此模式也被应用在许多地方,例如JavaBeansRml