最近在阅读HEAD+FIRST+设计者模式时,认为其中的事例非常有趣,于是希望在看的过程中,跟随书直接将代码演示,增进理解。同时将一些内容放到自己的博客中,方便日后查阅,或者其他小伙伴们看。
观察者模式要点:
1、观察者模式定义了对象之间一对多的关系
2、主题(也就是可观察者)用一个共同的接口来更新观察者
3、观察者和可观察者之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口
4、使用此模式时,你可从被观察者推(push)或拉(get)数据(然而,推的方式被认为更“正确”)。
5、有多个观察者时,不可以依赖特定的通知次序。
6、Java有多种观察者模式的实现,包括了通用的Java.util.Observable。
7、要注意Java.util.Observable实现上所带来的一些问题
8、如果有必要的话,可以实现自己的Observable,这并不难,不要害怕
9、Swing大量使用观察者模式,许多GUI框架也是如此。
10、此模式也被应用在许多地方,例如:JavaBeans、RMI。
观察者模式实例讲解以一个工作合约开始:
恭喜贵公司获选为敝公司建立下一代Internet气象观测站!该气象站必须建立在我们专利申请中的WeatherData对象上,由WeatherData对象负责追踪目前的天气状况(温度、湿度、气压)。我们希望贵公司能建立一个应用,有三种布告板,分别显示目前的状况、气相统计以及简单的预报。当WeatherData对象获得最新的测量数据时,是那种布告板必须实时更新。
而且这是一个可扩展的气象站,weather-o-Rama气象站希望公布一组API,好让其他开发人员可以写出自己的气象布告板,并插入此应用中。我们希望贵公司能提供这样的API。
weather-o-Rama气象站有很好的的商业运营模式:一旦客户上钩,他们使用每个布告板都要付钱。最好的部分就是,为了感谢贵公司建立此系统,我们将以公司的认股权支付你。
需求分析:
如上描述了客户的需求,经过分析:
WeatherData对象知道如何跟物理气象站联系,以取得更新的数据。weatherData对象取得数据,并更新三个布告板。
WeatherData对象有三个方法,getTemperature()、getHumidity()、getPressure() 方法分别获取这些值,
mentsChanged()方法可以通知外界,数值发生变化了!而我们的代码就要在该方法中被调用
当前已知环境:
1、WeatherData 类具有getter方法,可以取得测量值:温度、湿度与气压
2、当新的测量数据备妥时,measurementsChanged()方法就会被调用(我们不在乎此方法是如何被调用的,我们只在乎它被调用了)。
3、我们需要实现三个使用天气数据的布告板:“目前状况“布告、”气相统计”布告、“天气预报”布告。一旦WeatherData有新的测量,这些布告必须马上更新。
4、此系统必须可扩展,让其他开发人员建立定制的布告板,用户可以随心所欲地添加或删除任何布告板,目前初始的布告板有三类:“目前状况”布告、“气象监测”布告、“天气预告”布告
先简单以一个不妥的方案来简单示意一下,之后再提供完整的设计
//不妥方案示例
public void measurementsChanged(){
float temp=getTempreture();
int hum=getHumidity();
float pressure=getPressure();
CurrentConditionsDisplay.update(temp,hum,pressure);
ForeCastConditionDisplay.update(temp,hum,pressure);
SatisfyConditionDisplay.update(temp,hum,pressure);
}
如上发现,该设计存在多种问题,代码移植困难,不具备可扩展性。按照“变化的进行封装”、“针对接口编程而不是实现编程”的原则,经过仔细分析,按照基本设计原则进行修改调整,最终完成,发现其符合观察者模式的条件:
1、气象数据对策和布告板具备一对多的关系,并且后者紧密依赖前者
2、一个气象数据对象掌握者某些数据状态的变化情况,而布告板需要这些状态值
3、 布告板可能有多种类型,但是有一些基本的特征,即他们都需要调用数据更新的方法。
4、布告板需要实时地关注该对象
(如上理解只是个人理解,描述不恰当的地方还请指正)
鉴于各种原因,先贴上代码
package com.example.zhouxueli.myapplication.ObserverDesign;
public interface Subject {
/**
* 观察者模式中的主题,
* 观察者模式定义了对象之间的一对多依赖,这样一来&#