大话设计模式
字体: 16 + -

第62章

小a:“那它的组成部分哩?是不是就是有观察者和被观察者的就是属于观察者模式?”

大b:“不是。1、抽象目标角色:目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。2、抽象观察者角色:为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。3、具体目标角色:将有关状态存入各个具体观察者角色对象。当它的状态发生改变时,向它的各个观察者发出通知。4、具体观察者角色:存储有关状态,这些状态应与目标的状态保持一致。实现观察者角色的更新接口以使自身状态与目标的状态保持一致。在这个角色内也可以维护一个指向具体目标角色对象的引用。”

大b:“用一个实际的例子来说明:日常生活中说起观察者,最常见的例子可能就是天气预报,在这里我们的观察对象是地球,而我们是通过发射气象卫星这个观察者来检测地球气象变化的。”

所以这个例子中涉及三个对象:

地球(earth):被观察对象

气象卫星(satellite):观察者

气象局(weatherservice):客户端调用

被观察对象:地球(earth)

importjava.util.observable;

/***//**

*被观察对象:地球

*

*@version1.0

*/

publicclassearthextendsobservable{

privatestringweather=“晴朗”;

/***//**

*@returnreturnstheweather.

*/

publicstringgetweather(){

returnweather;

}

/***//**

*@paramweather

*theweathertoset.

*/

publicvoidsetweather(stringweather){

this.weather=weather;

//设置变化点

setchanged();

notifyobservers(weather);

}

}

[注意]在需检测的对象前需要设置变化点setchanged()和通知观察者notifyobservers(),这两个函数是由observable类实现的,封装了观察者模式实现的细节。

观察者:气象卫星(satellite)

importjava.util.observable;

importjava.util.observer;

/***//**

*观察对象:气象卫星

*

*@version1.0

*/

publicclasssatelliteimplementsobserver{

privatestringweather;

publicvoidupdate(observableobj,objectarg){

weather=(string)arg;

//捕获天气变化情况,反馈给检测者

system.out.println(近期天气变化:+weather);

}

}

客户端调用:气象局(weatherservice)

/***//**

*客户端调用:天气预报

*

*@version1.0

*/

publicclassweatherservice{

/***//**

*@paramargs

*/

publicstaticvoidmain(string[]args){

earthearth=newearth();

satellitesatellite=newsatellite();

//发射气象卫星

earth.addobserver(satellite);

system.out.println(天气预报:);

system.out.println(“——”);

earth.setweather(“台风‘珍珠’逼近”);

earth.setweather(“大到暴雨”);

earth.setweather(“天气炎热”);

}

}

[运行结果]

天气预报:

——

近期天气变化:台风‘珍珠’逼近

近期天气变化:大到暴雨

近期天气变化:天气炎热