觀察者模式

定義對象間的一種1對多的依賴關(guān)系,每當(dāng)這個對象的狀態(tài)改變時,其它的對象都會接收到通知并被自動更新。

觀察者模式有以下角色:

  • 抽象被觀察者:將所有已注冊的觀察者對象保存在一個集合中。
  • 具體被觀察者:當(dāng)內(nèi)部狀態(tài)發(fā)生變化時,將會通知所有已注冊的觀察者。
  • 抽象觀察者:定義了一個更新接口,當(dāng)被觀察者狀態(tài)改變時更新自己。
  • 具體被觀察者:實現(xiàn)抽象觀察者的更新接口。
簡單示例

1、抽象觀察者

public interface IObserver {
    void update(String msg);
}

2、具體觀察者

public class ObserverImpl implements IObserver {
    @Override
    public void update(String msg) {
        System.out.println("this is ObserverImpl  "+hashCode()+"  "+msg);
    }
}

3、抽象被觀察者

public interface IObservable {
    public void registerObserver(IObserver o);
    public void removeObserver(IObserver o);
    public void notifyObservers(String message);
}

4、具體被觀察者

public class ObservableImpl implements IObservable {
    private List<IObserver> mList = new ArrayList();

    @Override
    public void registerObserver(IObserver o) {
        mList.add(o);
    }

    @Override
    public void removeObserver(IObserver o) {
        if (mList != null) {
                mList.remove(o);
        }
    }

    @Override
    public void notifyObservers(String message) {
        for (IObserver observer : mList) {
                observer.update(message);
        }
    }
}

5、使用

@Test
    public void testObserver() {
        IObservable observable = new ObservableImpl();
        ObserverImpl observer1 = new ObserverImpl();
        observable.registerObserver(observer1);
        ObserverImpl observer2 = new ObserverImpl();
        observable.registerObserver(observer2);
        observable.notifyObservers("testObserver");
    }

this is ObserverImpl  693632176  testObserver
this is ObserverImpl  326549596  testObserver
  • 實現(xiàn)了觀察者和被觀察者之間的抽象耦合,容易擴展。
  • 有利于建立一套觸發(fā)機制。
  • 一個被觀察者卡頓,會影響整體的執(zhí)行效率。采用異步機制可解決此類問題。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容