觀察者模式

定義

觀察者模式又稱爲發佈訂閱模式。

定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者,使他們能夠自動更新自己。


場景舉例

微信公衆號訂閱。


具體實現

定義發佈者接口Observable

public interface Observable {
    // 註冊觀察者
    void registerObserver(Observer o);
    // 刪除觀察者
    void removeObserver(Observer o);
    // 向所有觀察者發佈通知
    void notifyObserver();
}

定義微信公衆號服務類實現了Observable接口 

public class WeChatServer implements Observable {
    private List<Observer> list = new ArrayList<>();
    private String message;
    // 註冊觀察者
    @Override
    public void registerObserver(Observer o) {
        list.add(o);
    }
    // 刪除觀察者
    @Override
    public void removeObserver(Observer o) {
        if (!list.isEmpty()) {
            list.remove(o);
        }
    }
    // 發佈消息給所有觀察者
    @Override
    public void notifyObserver() {
        for (Observer observer : list) {
            observer.update(message);
        }
    }
    // 新消息發佈
    public void publish(String s) {
        this.message = s;
        System.out.println("微信服務更新消息: " + s);
        //消息更新,通知所有觀察者
        notifyObserver();
    }
}

定義觀察者接口

public interface Observer {
    void update(String message);
}

定義用戶類User實現Observer

public class User implements Observer {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " 收到推送消息: " + message);
    }
}

測試類

public class Test {
    public static void main(String[] args) {
        // 創建發佈者
        WeChatServer server = new WeChatServer();
        // 創建觀察者
        Observer u1 = new User("張三");
        Observer u2 = new User("李四");
        Observer u3 = new User("王二麻子");
        // 註冊觀察者
        server.registerObserver(u1);
        server.registerObserver(u2);
        server.registerObserver(u3);
        // 發佈信息
        server.publish("Java從入門到精通!");
        System.out.println("----------------------------------------------");
        // 移除觀察者
        server.removeObserver(u1);
        // 發佈信息
        server.publish("Java從入門到入土!");
    }
}

結果打印:


觀察者模式總結

當一個對象的改變需要同時改變其它對象,並且它不知道具體要改變多個對象的時候,應該考慮使用觀察者模式。

觀察者模式所做的工作就是解除觀察者與被觀察者之間的耦合。

發佈了166 篇原創文章 · 獲贊 199 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章