android設計模式——觀察者模式
阿新 • • 發佈:2018-11-06
定義:物件間一種一對多的依賴關係,使得一個物件改變狀態,則所有依賴於他的物件都會得到通知並被自動更新
使用場景:
- 關聯行為場景。
- 事件多級觸發場景
- 跨系統的訊息交換場景。如訊息佇列,事件匯流排的處理機制。
應用舉例:觀察者訂閱被觀察者的狀態,當被觀察者狀態改變的時候會通知所有訂閱的觀察者的過程。
關鍵程式碼:在抽象類裡有一個 ArrayList 存放觀察者們。
類圖:
- Subject:抽象的被觀察者,把所有觀察者的引用儲存在一個集合裡,每個集合可以有任意數量的的觀察者,提供一個介面,可以增加和刪除觀察者
- ConcreteSubject:具體的被觀察者,實現抽象被觀察者的方法
- Observer:抽象的觀察者,定義一個更新介面(update方法),在被觀察者更改是通知自己
- ConcreteObserver:具體的觀察者,實現抽象觀察者的方法
優點:
- 觀察者和被觀察者是抽象耦合的。
- 建立一套觸發機制(訂閱系統)。
缺點:
- 被觀察者如果有很多觀察者的話,通知是很花費時間的
- 被觀察者只知道觀察者反生了變化,不知道為啥發生變化。
- 被觀察者和觀察者如果有迴圈呼叫的話,程式會發生崩潰。
//建立觀察者的抽象類 abstract class Observer{ public abstract void update(String msg); } //建立三個觀察者 class firstObserver extends Observer{ @Override public void update(String msg) { // TODO 自動生成的方法存根 System.out.println(firstObserver.class.getName()+"收到了資訊:"+msg); } } class secondObserver extends Observer{ @Override public void update(String msg) { // TODO 自動生成的方法存根 System.out.println(secondObserver.class.getName()+"收到了資訊:"+msg); } } class thirdObserver extends Observer{ @Override public void update(String msg) { // TODO 自動生成的方法存根 System.out.println(thirdObserver.class.getName()+"收到了資訊:"+msg); } } class Subject{ ArrayList<Observer> observersList = new ArrayList<>(); public void setMsg(String msg) { notifyAll(msg); } public void addAttach(Observer observer) { observersList.add(observer); } //通知所有的觀察者 private void notifyAll(String msg) { // TODO 自動生成的方法存根 for(Observer observer :observersList) { observer.update(msg); } } }
主函式
public static void main(String[] args) { // TODO 自動生成的方法存根 //建立三個觀察者 firstObserver firstObserver = new firstObserver(); secondObserver secondObserver = new secondObserver(); thirdObserver thirdObserver = new thirdObserver(); //建立被觀察者 Subject subject = new Subject(); subject.addAttach(firstObserver); subject.addAttach(secondObserver); subject.addAttach(thirdObserver); subject.setMsg("我要更新資訊"); }
執行結果
從執行結果來看,一旦被觀察者(subject)有什麼動作,觀察者(observer)都會收到。