設計模式之觀察者模式

使用場景:

1、對一個對象的改動需要同時改動其他對象,但又不知道具體有多少對象
2、當一個抽象模型有兩個部分,其中一個部分依賴於另外一個部分,將兩個部分封裝到獨立的對象中以實現獨立的複用
3、當一個對象必須通知其他對象,但又不知道其他對象時誰

涉及到的有:

抽象觀察者:定義爲一個接口,其中可以有任意數量的觀察者。可以添加、刪除抽象觀察者
抽象被觀察者:定義爲一個接口
具體觀察者:實現抽象觀察者接口,得到消息時通知自己。
具體被觀察者:實現抽象被觀察者接口。

抽象被觀察者:

public interface Watched {
    void addWatcher(Wather wather);
    void remove(Wather wather);
    void notifyWatchers();
}

具體被觀察者:

eg:微信公衆號爲一個被觀察者,在微信公衆號中有新消息時,通知所有關注公衆號的微信用戶

public class WeChat implements Watched{
    List<Wather>  wathers = new ArrayList<Wather>();
    public void addWatcher(Wather wather) {
        wathers.add(wather);
    }

    public void remove(Wather wather) {
        wathers.remove(wather);
    }

    public void notifyWatchers() {
        for(Wather w :wathers){
            w.update();
        }
    }
}

抽象觀察者:

public interface Wather {
    void update();
}

具體觀察者:

eg:微信用戶,得到消息時候更新自己

public class WeChatUser implements Wather {
    private String name;
    public WeChatUser(String name){
        this.name=name;
    }

    public void update() {
        System.out.println(name+" 收到更新消息!");
    }
}

測試類:

public class Test {
    public static void main(String[] args){
        WeChatUser user1 = new WeChatUser("遇見");
        WeChatUser user2 = new WeChatUser("sg");

        WeChat weChat = new WeChat();
        weChat.addWatcher(user1);
        weChat.addWatcher(user2);

        weChat.notifyWatchers();
    }
}

運行結果

這裏寫圖片描述

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