【設計模式與Android】觀察者模式——千里眼和順風耳

什麼是觀察者模式

 

所謂觀察者模式,就是定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則所有依賴於他的對象都會得到通知並被自動更新的設計模式。

 

觀察者模式的實現方式

 

觀察者調用Observer接口,被觀察者調用Observable接口。當被觀察者有更新時,遍歷所有觀察者,這樣就實現了一對多的通知功能。

 

《西遊記》第一回孫悟空出世,馬上便被千里眼和順風耳報告給玉皇大帝,這就是一個典型的觀察者模式。

 

首先定義觀察者

public class Spy implements Observer {

    private String name;

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

    @Override
    public void update(Observable o, Object arg) {
        Log.e(name+"發現","花果山"+arg);
    }
}

 

然後被觀察者是花果山

public class HuaguoMountain extends Observable {

    /**
     * 孫悟空登場
     * @param msg
     */
    public void SunWukongEnter(String msg){
        setChanged();
        notifyObservers(msg);
    }

}

 

被觀察者發生變化

HuaguoMountain mountain = new HuaguoMountain();
mountain.addObserver(new Spy("千里眼"));
mountain.addObserver(new Spy("順風耳"));
mountain.SunWukongEnter("山上有一仙石,石產一卵,見風化一石猴,在那裏拜四方,眼運金光,射衝斗府。");

 

Android源碼中的觀察者模式

 

(1)notifyDataSetChanged

無論ListView還是RecyclerView裏,notifyDataSetChanged方法都是至關重要的,這是最常見的觀察者模式。

 

2)BroadcastReceiver

BroadcastReceiver是Android四大組件之一,也是一個典型的觀察者模式。

 

3)EventBus

EventBus 是一個組件間通信框架,開發者在Activity、Fragment、Service、Thread之間傳遞消息時可以避免使用複雜的Intent、Handler和BroadCast

 

4)RxJava

RxJava作爲同樣基於觀察者模式的組件間通信框架,要比EventBus的應用更廣泛。尤其它針對Android的擴展——RxAndroid完全可以替代AsycTask來完成各種異步操作,而且還有BindActivity和BindFragment方法來避免異步操作時的Activity和Fragment的生命週期問題。

 

Android開發中如何利用觀察者模式

 

(1)在觀察者模式中,觀察者和被觀察者之間是抽象耦合,保證了訂閱系統的靈活性和可擴展性。在需要UI層與業務邏輯解耦的關聯行爲場景或事件多級觸發場景非常實用。

 

2)跨進程或者跨App的消息交換場景。

 

需要注意的幾個問題

 

1)因爲Java中消息的通知默認是順序執行,在觀察者過多或者某個觀察者出現卡頓的情況下,會影響整體的執行效率。


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