安卓設計模式-觀察者模式
安卓設計模式-觀察者模式
觀察者模式是什麼
觀察者模式又稱為模型檢視模式、源收聽者模式、或者從屬模式。在物件之間定義了一對多依賴,當一個物件(被觀察者)狀態改變,依賴他的物件(觀察者)會收到通知並自動更新。
有什麼
-
抽象被觀察者角色
一個抽象的主題,他把所有的觀察者物件的引用儲存在一個集合中,每個主題都有任意數量的觀察者,抽象主題提供一個介面,可以增加刪除觀察者角色 -
抽象觀察者角色
為所有的具體觀察者定義一個介面,在得到主題是更新自己 -
具體被觀察者角色
也就是具體的一個主題,在主題內部狀態改變時,所有登記者傳送通知 -
具體觀察者角色
實現抽象觀察者角色所需的介面更新。
怎麼做
觀察者模式主要通過以下步驟來實現,
- 定義一個主題介面
public interface Observerable{ public void registerObserver(Observer o); public void removeObserver(Observer 0); public void notifyObserver(); }
- 定義一個抽象觀察者介面
public interface Observer{ public void update (String msg); }
- 定義被觀察者實現observerable介面,對observerable三個介面進行具體實現,同事有一個List集合,用於儲存註冊的觀察者,等需要通知觀察者的時候,遍歷該集合即可
public class MyObserservable implement Observerable{ private List<Observer> list; private String msg; public MyObserverable(){ list=new ArrayList<Observer>(); } public void registerObserver(Observer o){ list.add(o); } public void removeObserver(Observer o){ if(!list.isEmpty()){ list.remove(o); } } public void notifyObserver(){ for(int i=0;i<list.size();i++){ Observer observer=list.get(i); observer.update(msg); } } public void setInfomation(Stirng s){ this.msg=s; notifyObserver(); } }
4.定義具體觀察者
public MyObserver implement Observer{ private msg=msg; public void update (String msg){ this.msg=msg; System.out.println(name + " 收到訊息: " + message); } } public MyObserver2 implement Observer{ private msg=msg; public void update (String msg){ this.msg=msg; System.out.println(name + " os2收到訊息: " + message); } }
- 測試
public class Test{ public static void mian(String args []){ MyObserver o1=new MyObserver(); MyObserver1 o2 =new MyObserver1(); MyObserservable os=new MyObserservable(); os.regiest(o1); os.regiest(o2); os.setInfomation("2222"); } }
什麼時候用
1.當一個物件改變需要通知其他物件,而不需要具體有多少物件需要通知的時候
2.一個物件必須通知其他物件,而並不知道這些物件是誰。
3.一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的物件中使它們可以各自獨立地改變和複用。
4.需要在系統中建立一個觸發鏈,A物件的行為將影響B物件,B物件的行為將影響C物件……,可以使用觀察者模式建立一種鏈式觸發機制。
優缺點
優點: 1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發機制。
缺點: 1、如果一個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。 2、如果在觀察者和觀察目標之間有迴圈依賴的話,觀察目標會觸發它們之間進行迴圈呼叫,可能導致系統崩潰。 3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化。