設計模式(二十) 觀察者模式

觀察者模式也是一種行為型模式,它的作用是將被觀察者的任何狀態(tài)變化傳遞給觀察者。觀察者模式在GUI編程的雙向綁定等領域都有應用。只要我們希望實現一個類似消息訂閱、接收的模式,就可以使用觀察者模式。

首先我們需要一個觀察者接口,當被觀察者發(fā)生變化的時候,需要通過該接口的方法通知觀察者。

public interface Observer<T> {
    void onChanged(T arg);
}

然后是被觀察者,當被觀察者被更改的時候,需要通過顯示調用update()方法告訴觀察者,“我已經發(fā)生了更改”。

public class Observable<T> {
    private List<Observer<T>> observers = new ArrayList<>();
    private T content;

    public Observable(T value) {
        content = value;
    }

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    protected void update(T value) {
        content = value;
        for (Observer ob : observers) {
            ob.onChanged(content);
        }
    }
}

然后來看看觀察者的實現。這個例子有一點不太好,就是觀察者使用了接口,但是被觀察者沒有使用接口。實際類庫中,一般都有被觀察者接口,我們可以實現該接口來實現自己的操作。這里的觀察者很簡單,接受消息,然后打印到終端上。

class ObserverImpl<T> implements Observer<T> {
    private String name;

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

    @Override
    public void onChanged(T arg) {
        System.out.println(name + " receives:" + arg);
    }
}

最后來測試一下。當被觀察者發(fā)生更改的時候,觀察者成功的接收到了更該消息。

    public void run() {
        Observable<String> sender = new Observable("value1");
        Observer<String> receiver1 = new ObserverImpl<>("ob1");
        Observer<String> receiver2 = new ObserverImpl<>("ob2");
        sender.addObserver(receiver1);
        sender.addObserver(receiver2);

        sender.update("value2");
        sender.update("value3");

    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 1 場景問題# 1.1 訂閱報紙的過程## 來考慮實際生活中訂閱報紙的過程,這里簡單總結了一下,訂閱報紙的基本流程...
    七寸知架構閱讀 4,675評論 5 57
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,268評論 25 708
  • 1 場景問題# 1.1 發(fā)送提示消息## 考慮這樣一個實際的業(yè)務功能:發(fā)送提示消息。基本上所有帶業(yè)務流程處理的系統(tǒng)...
    七寸知架構閱讀 5,088評論 5 63
  • 1 穆里尼奧又在斯坦福橋失利了,足總杯1/4決賽,曼聯客場挑戰(zhàn)切爾西,十人應戰(zhàn),輸掉比賽。 也許在穆里尼奧入主老特...
    歪豬閱讀 190評論 16 15