是本人學習Rxjava的經驗總結,因為RxJava是基于這個模式的,所以我們先學習這個觀察者模式,是完全必要的。會了這個模式再看RxJava就簡單很多了。
觀察者模式(Observer)模式: 是對象的行為模式,又叫做 發布-訂閱(Publish/Subscribe)模式、 模型-視圖(Model/View)模式、 源-監聽(Source/Listener)模式、 從屬(Depengdents)模式。
它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象是在狀態上發送變化時,會通知所有的觀察者對象,使得它們能夠自動更新自己。
UML圖: 
抽象主題(Subject)角色: 抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)里,每個主題都可以有任何數量的觀察者。 抽象主題提供一個接口,可以增加和刪除觀察者對象,抽象主題角色又叫做抽象被觀察者(Observable)角色。可以定義為接口或者抽象類,一般定義為抽象類
具體主題(ConcreteSubject)角色: 將有關聯狀態存入具體觀察者對象,在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知(調用抽象主題的notifyObserver)。具體主題角色又叫做具體觀察者(Concrete Observable)角色。
抽象觀察者(Observer)角色 一個接口。為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口。
具體觀察者(ConcreteObserver)角色 是抽象觀察者的實現類,實現父類的方法更新自己。存儲與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態相協調。如果需要,具體觀察者角色可以保持一個指向具體主題對象的引用。
四、自帶的Observer
java自帶有觀察者對象,Observer是觀察者,Obserable是被觀察者。下面來一個demo,三個文件即可:
具體觀察者ConcreteObserverpublic class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(Observable observable, Object o) { System.out.println(this.name+"收到消息:"+o.toString()); }}具體 被觀察者ConcreteObserverpublic class ConcreteObservable extends Observable { public void change(String str){ //注意,這里需要setChanged一下才能通知 setChanged(); //通知觀察者 notifyObservers(str); }}實現類public class MainClass { public static void main(String[] args){ //具體創建觀察者 ConcreteObserver one = new ConcreteObserver("第一個"); ConcreteObserver two = new ConcreteObserver("第二個"); //創建具體被觀察者 ConcreteObservable obserable = new ConcreteObservable(); obserable.addObserver(one); obserable.addObserver(two); obserable.change("通知消息"); obserable.deleteObserver(one); obserable.change("繼續通知"); }}編譯運行MainClass,即可輸出
第二個收到消息:通知消息第一個收到消息:通知消息第二個收到消息:繼續通知新聞熱點
疑難解答