Head First观察者模式(Observer)


观察者模式定义对象之间的一对多的依赖,当那一个对象(主题)状态改变时,所有的依赖者(观察者)都会收到通知并作出相应的动作。
观察者模式的使用非常广泛。

代码实现:
-------------------主题接口
public   interface  Subject {
       public   void  registerObserver(Observer o);
       public   void  removeObserver(Observer o);
       public   void  notifyObservers();

}
---------- 具体主题
public   class  WeatherData  implements  Subject{
       private  ArrayList<Observer>   observers  ;
       private   float   temperature  ;
       private   float   humidity  ;
       private   float   pressure  ;
     
       public  WeatherData(){
            this  . observers  new  ArrayList<Observer>();
     }

       @Override
       public   void  registerObserver(Observer o) {
            this  . observers  .add(o);
     }

       @Override
       public   void  removeObserver(Observer o) {
            int  i =  observers  .indexOf(o);
            if  (i >= 0){
                observers  .remove(i);
          }
     }

       @Override
       public   void  notifyObservers() {
            for  ( int  i=0; i<  observers .size(); i++){
              Observer o =  observers  .get(i);
              o.update(  this  . temperature  this .  humidity this  . pressure  );
          }
     }
     
       //当测量数据发送改变时,就通知这些观察者;
       public   void  measurementChanged(){
          notifyObservers();
     }
     
       //模拟实时监测数据的改变
       public   void  setMeasurement(  float  temperature,  float  humidity,  float  pressure){
            this  . temperature  = temperature;
            this  . humidity  = humidity;
            this  . pressure  = pressure;
          measurementChanged();
     }
}
-----------------观察者接口
public   interface  Observer {
       public   void  update( float  temp,  float  humidity,  float  pressure);
}
-----------辅助接口
public   interface  DisplayElement {
       public   void  display();
       //布告板显示的时候调用这个方法;
}
--------------具体观察者
//当前天气状况布告板
public   class  CurrentConditionDisplay  implements  Observer, DisplayElement{
       private   float   temperature  ;
       private   float   humidity  ;
       private  Subject  weatherData  ;
       //用WeatherData作为构造器参数,作为注册之用
       public  CurrentConditionDisplay(Subject weatherData){
            this  . weatherData  = weatherData;
          weatherData.registerObserver(  this  );
     }

       @Override
       public   void  display() {
          System.  out  .println( "CurrentConditionDisplay: "  this  . temperature  " F degrees and "
                             +  this  . humidity  "% humidity.." );
     }

       @Override
       public   void  update( float  temp,  float  humidity,  float  pressure) {
            //先把状态改变保存起来,而后进行业务处理(显示)
            this  . temperature  = temp;
            this  . humidity  = humidity;
          display();
     }
}
------------
//测试程序,其他的布告板实现也是类似的
public   class  WeatherStation {
       public   static   void  main(String[] args) {
          WeatherData data =  new  WeatherData();
          CurrentConditionDisplay ccd =  new  CurrentConditionDisplay(data);
          
            //改变主题状态
          data.setMeasurement(80, 50, 100);
     }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值