觀察者模式(本文是subject主動向observer推送消息且是自定義觀察者模式非java內置模式)定義了對象之間的一對多的依賴,這樣一來,當一個對象改變狀態時,它的全部依賴者都會收到通知並自動更新。java
設計原則:爲了實現交互對象之間的鬆耦合設計。ide
Subject接口:測試
package com.sun; public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); }
Subject接口的實現類WeatherData:this
package com.sun; import java.util.ArrayList; 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 notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer oberver = (Observer)observers.get(i); oberver.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(); } }
Observer接口:設計
package com.sun; public interface Observer { public void update(float temp,float humidity,float pressure); }
Object接口的其中一個公佈板實現類:code
package com.sun; public class CurrentConditionsDisplay implements Observer,DisplayElement{ private float temperature; private float humidity; private float pressure; private Subject weatherData; public CurrentConditionsDisplay(WeatherData weatherData) { this.weatherData = weatherData; weatherData.registerObserver(this); } @Override public void update(float temp, float humidity, float pressure) { this.temperature = temp; this.humidity = humidity; this.pressure = pressure; display(); } public void display(){ System.out.println("Current conditions:" + temperature + "F degrees and"+ humidity +" %humidity"); } }
DisplayElement公佈板顯示的接口:server
package com.sun; public interface DisplayElement { public void display(); }
測試類WeatherStation:對象
package com.sun; public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); weatherData.setMeasurements(80, 65, 30.4f); weatherData.setMeasurements(82, 70, 29.2f); } }