設計模式之觀察者模式

觀察者模式理論:定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新。blabla......

說了這麼多,然而並不知道怎麼實現。好!我們來想想報駕校的情形吧。很多人去報駕校,這麼多人,每個人都不一樣,但他們有一點是相同的,都是爲了拿駕照纔去報的名,也就是說他們目標一致。而作爲駕校需要做的事情就是準備一張報名表格,記錄報名者的信息和聯繫方式,然後通知他們到了哪個階段以及這個階段該做什麼事情,比如通知你這些天去訓練場地練車,等車練得差不多了之後會通知你去考科目二。下面用圖來解釋駕校和報名者需要做的事情:


觀察者模式包括的角色有:

1.抽象主題類(Subject):把所有對觀察者對象的引用保存在一個聚集裏,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象。

2.具體主題類(ConcreteSubject):具體主題,將有關狀態存入具體觀察者對象;在具體主題的內部狀態改變時,給所有登機過的觀察者發出通知。

3.觀察者類(Observer):爲所有的具體觀察者定義一個接口,在得到主題的通知時更新自己。

4.具體觀察者類(ConcreteObserver):實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。

UML圖如下:


代碼如下:

抽象主題類(Subject)代碼:

public abstract class Subject {
    /**
     * 用來保存註冊的觀察者對象
     */
    private    List<Observer> list = new ArrayList<Observer>();
    /**
     * 註冊觀察者對象
     * @param observer    觀察者對象
     */
    public void attach(Observer observer){
        
        list.add(observer);
        System.out.println("Attached an observer");
    }
    /**
     * 刪除觀察者對象
     * @param observer    觀察者對象
     */
    public void detach(Observer observer){
        
        list.remove(observer);
    }
    /**
     * 通知所有註冊的觀察者對象
     */
    public void nodifyObservers(String newState){
        
        for(Observer observer : list){
            observer.update(newState);
        }
    }
}
具體主題類(ConcreteSubject)代碼:

public class ConcreteSubject extends Subject{
    
    private String state;
    
    public String getState() {
        return state;
    }

    public void change(String newState){
        state = newState;
        System.out.println("主題狀態爲:" + state);
        //狀態發生改變,通知各個觀察者
        this.nodifyObservers(state);
    }
}
觀察者類(Observer)代碼:

public interface Observer {
    /**
     * 更新接口
     * @param state    更新的狀態
     */
    public void update(String state);
}
具體觀察者類(ConcreteObserver)代碼:

public class ConcreteObserver implements Observer {
    //觀察者的狀態
    private String observerState;
    
    @Override
    public void update(String state) {
        /**
         * 更新觀察者的狀態,使其與目標的狀態保持一致
         */
        observerState = state;
        System.out.println("狀態爲:"+observerState);
    }

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章