觀察者模式:定義了對象之間的一對多依賴狐援,這樣一來钢坦,當一個對象改變狀態(tài)時,它的所有依賴都會收到通知并自動更新啥酱。
類圖:
設(shè)計氣象站:
代碼:
三個接口:Subject爹凹、Observer、DisplayElement
/**
* Created by zyzhmily on 2018/5/20.
* 主題
*/
public interface Subject {
? ? public void registerObserver(Observer observer);
? ? public void removeObserver(Observer observer);
? ? public void notifyObserver();
}
/**
* Created by zyzhmily on 2018/5/20.
*/
public interface Observer {
? ? public? void update(float temperature,float humidity,float pressure);
}
/**
* Created by zyzhmily on 2018/5/20.
*/
public interface DisplayElement {
? ? public void display();
}
WeatherData:
/**
* Created by zyzhmily on 2018/5/20.
*/
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 observer) {
? ? ? ? observers.add(observer);
? ? }
? ? @Override
? ? public void removeObserver(Observer observer) {
? ? ? ? int i=observers.indexOf(observer);
? ? ? ? if (i>=0){
? ? ? ? ? ? observers.remove(i);
? ? ? ? }
? ? }
? ? @Override
? ? public void notifyObserver() {
? ? ? ? for (int i=0;i
? ? ? ? ? ? Observer observer= (Observer) observers.get(i);
? ? ? ? ? ? observer.update(temperature,humidity,pressure);
? ? ? ? }
? ? }
? ? public void measurementschanged(){
? ? ? ? notifyObserver();
? ? }
? ? public void setMeasurements(float temperature,float humidity,float pressure){
? ? ? ? this.temperature=temperature;
? ? ? ? this.humidity=humidity;
? ? ? ? this.pressure=pressure;
? ? ? ? measurementschanged();
? ? }
}
CurrentConditionsDisplay:
/**
* Created by zyzhmily on 2018/5/20.
*/
public class CurrentConditionsDisplay implements Observer,DisplayElement{
? ? private float temperature;
? ? private float humidity;
? ? private Subject weatherData;
? ? public CurrentConditionsDisplay(Subject subject) {
? ? ? ? this.weatherData=subject;
? ? ? ? weatherData.registerObserver(this);
? ? }
? ? @Override
? ? public void update(float temperature, float humidity, float pressure) {
? ? ? ? this.temperature=temperature;
? ? ? ? this.humidity=humidity;
? ? ? ? display();
? ? }
? ? @Override
? ? public void display() {
? ? ? ? System.out.println("Current conditions: "+temperature+" F degree and "+humidity+" % humidity");
? ? }
}
測試類:
/**
* Created by zyzhmily on 2018/5/19.
*/
public class PatternObserver {
? ? public static void main(String[] args){
? ? ? ? ? WeatherData weatherData=new WeatherData();
? ? ? ? ? CurrentConditionsDisplay currentConditionsDisplay=new CurrentConditionsDisplay(weatherData);
? ? ? ? ? weatherData.setMeasurements(80,65,30.4f);
? ? }
}
本文來自 《Head First 設(shè)計模式》