【java】設計模式之觀察者模式

首先告訴自己,這個模式很好理解。

事實上,確實是。

作用:當一個對象發生變化,需要其他對象也發生變化。

先看目錄




BeWatched:被觀察者類

Watcher:觀察者類

test:測試類

ITerface:存放接口。(名字貌似起錯了)


接口暫且不管。

Watcher.java

public class Watcher implements watcher.ITERFACE.IWatcher {
    private  String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


    @Override
    public void iGotABaby(){

        System.out.println("im "+name+" it told me sth~");
    }
}

屬性 name,getter和setter方法。

有一個iGotABabt 方法。這是被觀察者發生變化時,觀察者要執行的方法。


BeWatched.java

public class BeWatched implements watcher.ITERFACE.IBeWatched {

    private ArrayList<Watcher> a = new ArrayList<Watcher>();

    @Override
    public void add(Watcher w){
        if(!a.contains(w))
            a.add(w);
    }
    @Override
    public void notifySth(){
        for( Watcher w : a ){
         w.iGotABaby();
        }
    }

}

注意,這個模式的精髓就在於:觀察者實例對象,要存放在被觀察者實例對象裏的私有arraylist裏面。

此時,我們只需要再寫一個遍歷一下這個私有arraylist就ok了。


test.java

public class test {
    public static void main(String[] args) {
        BeWatched b  = new BeWatched();
        Watcher w1 = new Watcher();
        Watcher w2 = new Watcher();
        Watcher w3 = new Watcher();
        w1.setName("w1");
        w2.setName("w2");
        w3.setName("w3");

        b.add(w1);
        b.add(w2);
        b.add(w3);
        b.notifySth();
    }
}

實例化一個被觀察者,然後實例化3個觀察者,這三個觀察者的name分別叫 w1,w2,w3。

然後將這三個觀察者存入被觀察者的arraylist裏面,

當被觀察者執行(發生變化)notifySth方法的時候,遍歷每一個觀察者,執行iGotABaby方法。


結果如下:

im w1 it told me sth~
im w2 it told me sth~
im w3 it told me sth~



至於接口,從這兩個類裏面提取出來即可。

建議學習設計模式的時候,先思考這個模式的應用場景,寫出具體的類,最後提取接口。不然容易本末倒置。

這是比較簡單的觀察者模式,如果出現觀察者聯動呢?

可以在這個被觀察者上,再加一層被觀察者。即a->b->c這種。

設計無窮,思維要活。

不知道爲什麼,之前發了好幾篇關於設計模式的學習心得,只有單例模式發出了。其他的,不見了。


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