Android設計模式—觀察者模式

裝載請標明出處:http://www.javashuo.com/article/p-bnuyxkop-mg.html html

 

觀察者模式設計模式

說白了,就是一個對發生改變,全部依賴於它的對象也發生改變,這是一對多的關係。異步

好比對象A,對象B,對象C。B與C依賴於A,那麼A發生改變,B與C也將發生改變。此時A是被觀察者,B與C是觀察者。ide

 

觀察者模式又被稱做發佈/訂閱模式,主要是爲了讓觀察者與被觀察者之間進行解耦。this

 

UML圖:spa

 

 

 角色說明:設計

Subject(抽象主題):被觀察者的一個抽象類,它會把全部觀察者的引用保存在一個集合裏。抽象主題提供一個接口,能夠增長和刪除觀察者對象。3d

ConcreteSubject(具體主題):具體的被觀察者。當具體被觀察者的狀態發生改變的時候,會給每個註冊過的觀察者發送通知。調試

Observer(抽象觀察者):全部具體觀察者的一個抽象類,爲全部的具體觀察者定義了一個接口:獲得主題的通知時候更新本身。code

ConcrereObserver(具體觀察者):抽象觀察者的具體實現。

 

咱們看一下具體的例子:

上課鈴聲響起時候,老師與學生們的不一樣反應。

一、定義一個抽象主題:

    該抽象主題定義了一些通用的方法,即具體主題裏面須要實現的。

//抽象被觀察者
public interface Observable {
    //添加觀察者
    void addObserver(Observer observer);

    //移除觀察者
    void deleteObserver(Observer observer);

    //通知觀察者
    void notifyObserver(String msg);
}

 

二、建立一個具體主題(上課鈴聲):

public class AlarmClock implements Observable {
    //保存觀察者對象
    List<Observer> list = new ArrayList<>();

    @Override
    public void addObserver(Observer observer) {
        list.add(observer);
    }

    @Override
    public void deleteObserver(Observer observer) {
        list.remove(observer);
    }

    /**
     * 通知觀察者
     * @param msg
     */
    @Override
    public void notifyObserver(String msg) {
        for (Observer observer : list) {
            observer.action(msg);
        }
    }
}

 

三、建立抽象觀察者:

     定義了全部具體觀察者須要實現的方法,聽到鈴聲後的行爲

//抽象觀察者
public interface Observer {
    void action(String msg);
}

 

四、建立具體觀察者:

public class Students implements Observer {

    String name;

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

    @Override
    public void action(String msg) {
        System.out.println(msg + name + "開始聽課");
    }
}
public class Teacher implements Observer {
    @Override
    public void action(String msg) {
        System.out.print(msg + "老師開始講課");
    }
}

 

六、實現:

Observable alarmClock = new AlarmClock();

Observer student1 = new Students("小屁孩");
Observer student2 = new Students("大屁孩");
Observer teacher = new Teacher();

//註冊觀察者
alarmClock.addObserver(student1);
alarmClock.addObserver(student2);
alarmClock.addObserver(teacher);

//被觀察者通知已經註冊的觀察者
alarmClock.notifyObserver("上課鈴聲已經響了");

 

七、結果:

 

到這裏咱們便實現了觀察者模式。

 

應用場景

  • 當一個對象的改變須要通知其它對象改變時,並且它不知道具體有多少個對象有待改變時。
  • 當一個對象必須通知其它對象,而它又不能假定其它對象是誰
  • 跨系統的消息交換場景,如消息隊列、事件總線的處理機制。

優勢

  • 解除觀察者與主題之間的耦合。讓耦合的雙方都依賴於抽象,而不是依賴具體。從而使得各自的變化都不會影響另外一邊的變化。
  • 易於擴展,對同一主題新增觀察者時無需修改原有代碼。

 缺點

  • 依賴關係並未徹底解除,抽象主題仍然依賴抽象觀察者。
  • 使用觀察者模式時須要考慮一下開發效率和運行效率的問題,程序中包括一個被觀察者、多個觀察者,開發、調試等內容會比較複雜,並且在Java中消息的通知通常是順序執行,那麼一個觀察者卡頓,會影響總體的執行效率,在這種狀況下,通常會採用異步實現。
  • 可能會引發多餘的數據通知。

JDK內部也內置了Observable(抽象被觀察者),Observer(抽象觀察者)這兩個類,咱們也能夠直接拿來用,具體能夠去看看源碼。
 
Android中有不少地方也用到了觀察者模式:
  • 點擊事件
  • listView的刷新
  • 廣播等等
相關文章
相關標籤/搜索