觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的全部依賴者都會收到通知並自動更新。實現觀察者模式的方式不止一種,可是以包含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"); } }