java observer_Java中的观察者模式(Observer)

Java作为一种面向对象的开发语言,对实设计模式提供了良好的支持,并且提供了许多默认的实现,比如:通过Java中的Observable类和Observer接口可以方便的实现观察者模式。 中国自学编程网 www.zxbc.cn

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

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

地球  (Earth):                                          被观察对象

气象卫星(Satellite):                        观察者

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

被观察对象:地球  (Earth)

import    java.util.Observable;

/**  */  /**

*  被观察对象:地球

*

*    @author    zjun

*    @version    1.0  create  on  2006-5-18  9:42:45

*/

public      class    Earth    extends    Observable      {

private    String  weather    =      "  晴朗  "  ;

/**  */  /**

*    @return    Returns  the  weather.

*/

public    String  getWeather()      {

return    weather;

}

/**  */  /**

*    @param    weather

*                        The  weather  to  set.

*/

public      void    setWeather(String  weather)      {

this  .weather    =    weather;

//    设置变化点

setChanged();

notifyObservers(weather);

}

}

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

观察者:气象卫星(Satellite)

import    java.util.Observable;

import    java.util.Observer;

/**  */  /**

*  观察对象:气象卫星

*

*    @author    zjun

*    @version    1.0  create  on  2006-5-18  9:46:30

*/

public      class    Satellite    implements    Observer      {

private    String  weather;

public      void    update(Observable  obj,  Object  arg)      {

weather    =    (String)  arg;

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

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

}

}

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

/**  */  /**

*  客户端调用:天气预报

*

*    @author    zjun

*    @version    1.0  create  on  2006-5-18  9:57:19

*/

public      class    WeatherService      {

/**  */  /**

*    @param    args

*/

public      static      void    main(String[]  args)      {

Earth  earth    =      new    Earth();

Satellite  satellite    =      new    Satellite();

//    发射气象卫星

earth.addObserver(satellite);

System.out.println(  "  天气预报:  "  );

System.out.println(  "  ------------  "  );

earth.setWeather(  "  台风‘珍珠’逼近  "  );

earth.setWeather(  "  大到暴雨  "  );

earth.setWeather(  "  天气炎热  "  );

}

}

[运行结果]

天气预报:

------------

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

近期天气变化:大到暴雨

近期天气变化:天气炎热

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2008-03-26 18:02

浏览 804

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值