观察者模式

总述:

设计原则:

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

设计模式:

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


 

 

观察者模式中有两类对象:主题和观察者。

主题只有一个,观察者有许多。

常见的应用场景:数据更新到客户端

他们之间的依赖关系:因为主题是拥有数据的人,观察者是主题的依赖者,在数据变化更新时,这样比起让许多对象控制同一份数据来说,可以得到更干净的OO设计

 

常见的观察者模式的类图设计

 

主题接口:对象使用此类接口注册成为观察者,或者把自己从观察者中删除

观察者接口:所有潜在的观察者必须实现观察者接口,这个接口只实现update()这一个方法,当状态改变时,它被调用。

具体主题类:实现主题接口,除了注册和和撤销方法之外,具体主题还要实现notifyObserver()的方法,此方法用于在状态改变时更新所有当前观察者。

                     具体主题类也可能有设置和获取状态的方法。

 

下面来介绍一下松耦合。

当两个对象处于松耦合状态,他们依然可以交互,但是不太清楚彼此之间的细节。

所以松耦合顾名思义,即利用接口来实现对象与对象之间的关系,以达到改变主题或观察者的其中一方,保证另外一方的代码不需要修改。

松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为把对象之间的相互依赖降到了最低。

之所以利用接口作为载体是因为每个观察者观察的角度是有差异的,我们只需做到把数据的传输统一在两个接口之间即可。

 

松耦合带来的实用场景:

保证主题不受影响的情况下:

• 任何时候我们都可以增加新的观察者,要做的只是在新的类里实现观察者接口。

• 可以用新的观察者取代现有的观察者。

 

所以这里引出了一个新的设计原则:

 


 

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

 


 

实战案例:设计气象站

 

 

下面我们要依照上面的类图来实现这个系统了

我们这里选择不去调用Java内置的支持,自己动手创建。


 

首先我们来建立接口:

接下来在WeatherData类中实现主题接口:

 

现在我们来建立Observer接口的实现类:

最后建立调试类验证程序:

结果:

 


 

 

至此,我们再把观察者模式的行为具体一些:

观察者模式其中很大的意义是保证主题的安全性。

观察者模式相比于正常的getter,setter方法,更像是主题将数据通过update方法“推”出来,而getter方法更像是“取”出来的感觉。

posted @ 2019-07-18 21:31  高物终结者  阅读(173)  评论(0编辑  收藏  举报