head first设计模式之观察者模式

观察者模式=出版者+订阅者

观察者模式=主题(subject)+观察者(observer)

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


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

接口

public interface Subject {   
     public void registerObserver(Observer o);    
     public void removeObserver(Observer o);    
     public void notifyObservers(); 
}


public interface Observer {   
      public void update(float temp, float humidity, float pressure); 
}


public interface DisplayElement {    
     public void display(); 
}


在WeatherData中实现主题接口

public class WeatherData implements Subject{
     private ArrayList observers;    
     private float temperature;    
     private float humidity;    
     private float pressure;        
     public WeatherData() {        
         observers = new ArrayList();    
     }        
     public void registerObserver(Observer o) {
          observers.add(o);    
     }        
     public void removeObserver(Observer o) { 
           int i = observers.indexOf(o);        
           if (i >= 0) {            
               observers.remove(i);        
           }    
     }        
     public void notifyObservers() {        
         for (int i = 0; i < observers.size(); i++){
              Observer observer = (Observer)observers.get(i);            
              observer.update(temperature, humidity, pressure);        
          }   
     }       
     public void measurementsChanged() {   
            notifyObservers();    
     }        
     public void setMeasurements(float temperature, float humidity, float pressure) {        
           this.temperature = temperature;      
           this.humidity = humidity;       
           this.pressure = pressure;    
           measurementsChanged();   
     }        
     // WeatherData的其他方法 
}

观察者类

<pre name="code" class="java">public class CurrentConditionsDisplay implements Observer, DisplayElement {   
   private float temperature;    
   private float humidity;    
   private Subject weatherData;       
   public CurrentConditionsDisplay(Subject weatherData) {        
      this.weatherData = weatherData;        
      weatherData.registerObserver(this);    
   }        
   public void update(float temperature, float humidity, float pressure) {        
     this.temperature = temperature;        
     this.humidity = humidity;        
     display();    
   }        
   public void display() {       
      System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");   
   } 
}


 

测试

<pre name="code" class="java">public class WeatherStation {
    public static void main(String[] args) {        
       WeatherData weatherData = new WeatherData();            
       CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);        
       StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);        
       ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);
       weatherData.setMeasurements(80, 65, 30.4f);        
       weatherData.setMeasurements(82, 70, 29.2f);        
       weatherData.setMeasurements(78, 90, 29.2f);    
    } 
}


 


==============================================================================

改变方式,上面是“推”,改为“拉”,观察者主动请求数据,而不再是被动的接受主题者推送的对多个观察者无差别的推送。

使用Java内置的 观察者模式。

把,把WeatherData改成使用 java.util.Observable

<pre name="code" class="java">import java.util.Observable; 
import java.util.Observer;    
public class WeatherData extends Observable {    
    private float temperature;    
    private float humidity;    
    private float pressure;        
    public WeatherData() { }        
    public void measurementsChanged() {        
       setChanged();        
       notifyObservers();    
    }          
    public void setMeasurements(float temperature, float humidity, float pressure) {        
        this.temperature = temperature;        
        this.humidity = humidity;        
        this.pressure = pressure;        
        measurementsChanged();    
    }        
    public float getTemperature() {        
        return temperature;    
    }        
    public float getHumidity() {        
        return humidity;    
    }        
    public float getPressure() {        
        return pressure;    
    } 
}


 


重做CurrentConditionsDisplay
<pre name="code" class="java">import java.util.Observable; 
import java.util.Observer;    
public class CurrentConditionsDisplay implements Observer, DisplayElement {    
    Observable observable;    
    private float temperature;    
    private float humidity;        
    public CurrentConditionsDisplay(Observable observable) {        
        this.observable = observable;        
        observable.addObserver(this);    
    }        
    public void update(Observable obs, Object arg) {        
        if (obs instanceof WeatherData) {            
            WeatherData weatherData = (WeatherData)obs;            
            this.temperature = weatherData.getTemperature();            
            this.humidity = weatherData.getHumidity();            
            display();        
         }    
    }        
    public void display() {        
        System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");    
    } 
}

 

***代码来自head first 设计模式

                  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值