觀察者模式

01 定義

觀察者模式:定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態(tài)時,它的所有依賴者都會收到通知并自動更新。

02 情景

觀察者A和觀察者B都訂閱了天氣預報(被觀察者),當天氣預報發(fā)生變化時,觀察者A和觀察者B都能收到通知。

03 UML

Observer Pattern.png

04 Interface

// 被觀察者
public interface Observable {
    void addObserver(Observer o);
    void deleteObserver(Observer o);
    void notifyObservers();
}
// 觀察者
public interface Observer {
    // 更新天氣
    void update(int temperature);
}

05 Class

// 天氣預報(被觀察者)
public class WeatherObservable implements Observable {
    private ArrayList<Observer> observers;
    private int temperature;

    public WeatherObservable(){
        observers = new ArrayList<>();
    }

    public void SetTemperature(int temperature){
        this.temperature = temperature;
        temperatureChanged();
    }
    private void temperatureChanged(){
        notifyObservers();
    }
    @Override
    public void addObserver(Observer o) {
        if(o != null && !observers.contains(o)){
            observers.add(o);
        }
    }
    @Override
    public void deleteObserver(Observer o) {
        observers.remove(o);
    }
    @Override
    public void notifyObservers() {
        for(Observer observer : observers){
            observer.update(temperature);
        }
    }
}
// 觀察者A
public class ObserverA implements Observer {
    public void subscribe(Observable observable){
        observable.addObserver(this);
    }
    public void unSubscribe(Observable observable){
        observable.deleteObserver(this);
    }
    @Override
    public void update(int temperature) {
        display(temperature);
    }
    public void display(int temperature){
        System.out.println("This is from ObserverA : " + temperature);
    }
}
// 觀察者B
public class ObserverB implements Observer {
    public void subscribe(Observable observable){
        observable.addObserver(this);
    }
    public void unSubscribe(Observable observable){
        observable.deleteObserver(this);
    }
    @Override
    public void update(int temperature) {
        display(temperature);
    }
    public void display(int temperature){
        System.out.println("This is from ObserverB : " + temperature);
    }
}

06 測試

WeatherObservable weatherObservable = new WeatherObservable();

ObserverA observerA = new ObserverA();
observerA.subscribe(weatherObservable);
ObserverB observerB = new ObserverB();
observerB.subscribe(weatherObservable);

weatherObservable.SetTemperature(10);
// 取消訂閱
observerA.unSubscribe(weatherObservable);
weatherObservable.SetTemperature(20);
TestResult.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容