觀察者模式

觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的全部依賴者都會收到通知並自動更新。實現觀察者模式的方式不止一種,可是以包含Subject(主題接口)與Observer(觀察者接口)接口的類設計的作法最多見ide

例子: 在作氣象站的告示牌的時候,我首先建立了主題接口和觀察者接口, 主題接口有登陸、註冊、刪除的方法,觀察者接口有修改方法,參數 爲告示牌的值。 而後建立一個主題類,該類鏈接主題接口,實現主題方法,在該類中 實現業務邏輯this

public class WeatherData implements Subject {

  private ArrayList observers;
  private float temperature;
  private float humidity;
  private float pressure;

  public WeatherData(){
      observers = new ArrayList();
  }

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

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

  @Override
  public void notifyObserver() {
      for (int i=0;i<observers.size();i++){
          Observer observer=(Observer) observers.get(i);
          observer.update(temperature,humidity,pressure);
      }
  }

  public void getTemperature(){

  }
  public void getHumidity(){

  }
  public void getPressure(){

  }
  public void measurementsChanged(){
      notifyObserver();
  }
  public void setMeasurements(float temperature,float humidity,float pressure){
      this.temperature=temperature;
      this.humidity=humidity;
      this.pressure=pressure;
      measurementsChanged();
  }
}

再建立觀察者類,實現觀察者接口,屬性爲告示牌屬性 和主題類,在該構造方法中對主題類初始化。spa

import com.example.demo3.face.DisplayElement;
import com.example.demo3.face.Observer;
import com.example.demo3.face.Subject;

public class CurrentConditionsDisplay implements Observer,DisplayElement{
  private float temperature;
  private float humidity;
  private Subject weatherData;

  public CurrentConditionsDisplay(Subject weatherData){//構造器須要weatherData對象(也便是主題)做爲註冊之用
      this.weatherData=weatherData;
      weatherData.registerObserver(this);
  }

  @Override
  public void update(float temperature, float humidity, float pressure) {//當update()被調用時,咱們把溫度和溼度保存起來,而後調用display()
      this.temperature=temperature;
      this.humidity=humidity;
      display();
  }

  @Override
  public void display() {
      //顯示當前觀測值
      System.out.println("Current conditions: "+temperature+"F degrees and "+
      humidity+"% humidity");
  }
}
相關文章
相關標籤/搜索