觀察者模式

觀察者模式:
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
自己的理解:觀察者模式相當於書刊==》訂閱者這種類型,比如說:我訂閱了一本《讀者》,然後讀者每發行一版就會給我發送一次新的週刊。
類圖:(上一個策略模式的類圖是自己隨意畫的,很不好,還是找的一個,看來以後的將UML也學習一番了。)

下面我們來看代碼:
主題接口:
public interface Subject {
    void addObserver(Observer obs);
    void removeObserver(Observer obs);
    void notifyObserver();
}

主題接口設計三個方法:
一個爲註冊觀察者方法addObserver(Observer obs),一個爲 註銷觀察者方法:removeObserver(Observer obs);最後一個爲提醒觀察者:notifyObserver();
主題實現類:
public class ConcreteSubject implements Subject {

    private String state = "this is ConcreteSubject state";

    private List<Observer> observerList=new ArrayList<Observer>();



    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public void addObserver(Observer obs) {
        // TODO Auto-generated method stub
        this.observerList.add(obs);
    }

    @Override
    public void removeObserver(Observer obs) {
        // TODO Auto-generated method stub
        this.observerList.remove(obs);
    }

    @Override
    public void notifyObserver() {
        // TODO Auto-generated method stub
        for (Observer obs: observerList) {
            obs.action(state);
        }

    }

}

抽象觀察者:
public interface Observer {

    void action(String state);
}

抽象觀察者主要用於執行觀察者的共同方法
實例觀察者:
public class ConcreteObserver implements Observer {

    @Override
    public void action(String state) {
        // TODO Auto-generated method stub
        System.out.println(state);
    }

}

實例觀察者用來實現相應的方法。
下面我們來看實現代碼:
public class ObserverTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ConcreteSubject sub = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        sub.addObserver(observer);
        sub.notifyObserver();
        sub.setState("this is the changed");
        sub.notifyObserver();
        sub.removeObserver(observer);
        sub.notifyObserver();
    }

}

開始的時候,我們提到書刊訂閱,這種是書刊主動推送,如果讀者想自己取是不是會更好呢?觀察者模式中恰好就有這種類型。我們一般將上面的例子稱爲推模式,而接下來的這種稱爲拉模式。代碼如下:
主題接口:
public interface Subject {
    void addObserver(Observer obs);
    void removeObserver(Observer obs);
    void notifyObserver();
}

主題接口設計三個方法:
一個爲註冊觀察者方法addObserver(Observer obs),一個爲 註銷觀察者方法:removeObserver(Observer obs);最後一個爲提醒觀察者:notifyObserver();
主題實現類:
public class ConcreteSubject implements Subject {

    private String state = "this is ConcreteSubject state";

    private List<Observer> observerList=new ArrayList<Observer>();



    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public void addObserver(Observer obs) {
        // TODO Auto-generated method stub
        this.observerList.add(obs);
    }

    @Override
    public void removeObserver(Observer obs) {
        // TODO Auto-generated method stub
        this.observerList.remove(obs);
    }

    @Override
    public void notifyObserver() {
        // TODO Auto-generated method stub
        for (Observer obs: observerList) {
            obs.action(this);
        }

    }


}

抽象觀察者:
public interface Observer {

    void action(ConcreteSubject concreteSubject );
}

抽象觀察者主要用於執行觀察者的共同方法
實例觀察者:
public class ConcreteObserver implements Observer {

    @Override
    public void action(ConcreteSubject concreteSubject) {
        // TODO Auto-generated method stub
        System.out.println(concreteSubject.getState());
    }

}


實例觀察者用來實現相應的方法。
下面我們來看實現代碼:
public class ObserverTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ConcreteSubject sub = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        sub.addObserver(observer);
        sub.notifyObserver();
        sub.setState("this is the changed");
        sub.notifyObserver();
        sub.removeObserver(observer);
        sub.notifyObserver();
    }

}


ok,今天的分享就到這裏了。
另外,java內部也有觀察者模式的相關類,大家可以網上查相關資料,我這裏就不贅述了。
歡迎大家來拍磚,有什麼好的建議也可以留言,大家一起學習哈。。。大笑





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