-
在實際開發中,如果意識到模塊功能是觀察者模式,則可以對通用觀察者模式的代碼進行套用. 例子: 1.抽象主題角色是具體主題角色統一的一個接口. (知道訂閱的人的基本信息,以及有添加和刪除和通知訂閱的人的方法) 2.可以有很多具體主題角色實現類,代表不同的具體主題,如天氣預報主題實現類,可以實例化多個具體主題的對象,初始化不同屬性即可,即不同地區的天氣預報情況,具體主題角色都繼承抽象主題角色. (不同的具體主題角色對象會有自己的狀態信息,即不同地區的天氣預報信息,且不同具體主題角色對象中保存的訂閱者一般不同,所以具體主題角色類只通知訂閱了該具體主題角色類的訂閱者) 3.抽象觀察者角色是所有訂閱不同具體主題的人的一個接口. (存在更新方法的接口,參數是抽象主題角色類型,以便訂閱情況不同的觀察者可以獲取對應不同的具體主題的狀態信息,所有訂閱情況不同的具體觀察者角色類都會實現該更新方法,作出不同的業務邏輯) 4.具體觀察者角色是某類特定的人訂閱某個具體主題,可以有多個具體觀察者的類,代表訂閱不同具體主題的人群,不同實現類在更新方法上可以作出自己相應的操作,每個類又可以實例化多個具體觀察者角色對象,代表訂閱同一具體主題的人群,初始化不同的屬性即可. (類中除了提供用來保存具體觀察者同步被觀察者的狀態信息屬性外,還可以創建用來存放具體觀察者的其他屬性,如觀察者的名字、具體觀察者狀態發生改變時需提醒具體觀察者的內容等.只有保持同步信息的屬性是從被觀察者中獲取的,其他屬性都是由觀察者自己設置,當具體主題角色調用Notify()方法后會自動調用觀察者的update()方法) 測試類中: 1.首先創建一個具體主題角色對象. 2.創建具體觀察者對象,可以任意個,初始化觀察者的屬性. 3.注冊觀察者到具體主題角色的觀察者列表中. 4.具體主題角色更新狀態信息(發布信息) 觀察者模式的好處就是統一通知,各自處理.查看全部
-
//具體被觀察者對象,負責把有關狀態信息及時更新到相應的觀察者對象中. public class ConcreteSubject extends Subject{ //具體被觀察者對象的狀態信息 private String subjectState; public String getSubjectState(){ return subjectState; } //當具體被觀察者的狀態信息發生改變時,即使用了setSubjectState()方法,則會調用繼承父類的notifyObservers()方法來進行通知觀察者類. public void setSubjectState(String subjectState){ this.subjectState = subjectState; this.notifyObservers(); } } //觀察者接口,聲明一個更新的方法,當具體被觀察者對象發生改變時可以及時更新觀察者. public interface Observer{ //具體觀察者進行更新的方法.傳入被觀察類,方便獲取相應具體被觀察類的狀態. public void update(Subject subject); } //具體的觀察者對象,實現更新方法,使自身的狀態和具體被觀察者的狀態保持一致. public class ConcreteObserver implements Observer{ //具體觀察者的狀態信息 private String observerState; //實現更新方法 public void update(Subject subject){ //獲取具體被觀察者的狀態(因此要把抽象被觀察者類轉換為具體被觀察者類), 使具體被觀察者狀態與具體觀察者狀態保持一致 this.observerState=((ConcreteSubject)subject).getSubjectState(); } }查看全部
-
//抽象被觀察者角色,它知道觀察它的觀察者,并提供注冊(添加)和刪除觀察者的接口 public abstract class Subject{ //用于保存注冊的觀察者對象 private List<Observer> observers =new ArrayList<Observer>(); //把觀察者添加到觀察者集合中 public void attach(Observer observer){ observers.add(observer); } //刪除觀察者集合中指定的觀察者. public void detach(Observer observer){ observers.remove(observer); } //通知方法,需要通知觀察者列表中的所有觀察者. protected void notifyObservers(){ for(Observer observer : observers){ //把當前具體被觀察者對象傳入到update參數中,以便在update()方法中獲取被觀察者的狀態信息. observer.update(this); } } }查看全部
-
觀察者模式通用代碼 被觀察者的狀態信息要與觀察者的狀態信息保持一致,因此當被觀察者更新時能及時更新觀察者中的狀態信息. 組成角色: 抽象主題(Subject)角色:抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)里,每個主題都可以有任何數量的觀察者.抽象主題提供一個接口,可以增加和刪除觀察者對象,抽象主題角色又叫做抽象被觀察者(Observable)角色. 具體主題(ConcreteSubject)角色:將有關狀態存入具體觀察者對象,在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知.具體主題角色又叫做具體被觀察者(Concrete Observable)角色. 抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口. 具體觀察者(ConcreteObserver)角色:存儲與主題的狀態自恰的狀態.具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調.具體觀察者角色可以保持一個指向具體主題對象的引用.查看全部
-
觀察者模式結構: Subject(被觀察的對象)維護一系列的Observer觀察者列表. 在Subject中會有添加觀察者Attach()方法與刪除觀察者Detach()方法. 有Notify()方法,當有新的情況更新時,就會自動觸發Notify()方法,通知觀察者列表的所有觀察者. 在觀察者Observer中,當收到Notify()通知后會自動調用觀察者中的Update()方法進行更新.查看全部
-
觀察者模式 定義:對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新. 觀察者稱為Observer 觀察者觀察的目標稱為Subject 一個目標可以有任意個觀察者對象.一旦目標的狀態發生改變,觀察者可以得到通知,各個觀察者可以根據通知作出相應的響應,執行相應的業務邏輯處理.查看全部
-
適用情況查看全部
-
觀察者的缺點查看全部
-
觀察者的優點查看全部
-
模型比較查看全部
-
拉模型查看全部
-
拉模型查看全部
-
推模型查看全部
-
實現觀察者的兩種方式查看全部
-
觀察者模式實現步驟查看全部
舉報
0/150
提交
取消