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

什麼是觀察者模式設計模式

 

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

 

觀察者模式的實現方式異步

 

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

 

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

 

首先定義觀察者spa

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);
    }
}設計

 

而後被觀察者是花果山server

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中消息的通知默認是順序執行,在觀察者過多或者某個觀察者出現卡頓的狀況下,會影響總體的執行效率。

相關文章
相關標籤/搜索