-
訂閱者也就是觀察者:黃明的老媽和黃明的女朋友 實現:當天氣更新時,黃明老媽和黃明女朋友會收到各自的天氣信息內容。 代碼流程:定義一個跟天氣有關的目標對象,內部有訂閱者的列表,以及attach添加訂閱者、detach刪除訂閱者以及通知訂閱者并調用訂閱者自有的update(目標對象)更新目標狀態的方法。在具體的實現中,添加了天氣內容的屬性,生成get/set方法使得外部可以調用,當設置新的天氣內容時,除了給屬性賦值以外,還要調用父類的notifyObserver().update(天氣內容)通知訂閱者更新目標對象。在訂閱者中,除了有接口的update(目標對象)方法外,想要完整的接收內容還必須有自己獨特的屬性,也就是訂閱者自己的名字和通知信息,這兩個參數是訂閱者決定的,而天氣信息是從目標對象中獲取的,這里是調用了update(ConcreteWetherSubjetc weather)接收最新的目標對象,并通過getWetherSubject()強制轉換為具體的實現來獲得最新的天氣信息。然后輸出訂閱者名字+天氣信息+通知信息。 測試流程是:創建目標對象,創建訂閱者(創建訂閱者的名稱以及通知信息),然后調用目標對象的attach添加訂閱者,當調用目標對象的setWeatherContent()添加信息時,目標對象的狀態發生改變,便通知訂閱者更新內容。打印內容輸出到控制臺。查看全部
-
目標對象里有著所有觀察者的集合,而且提供了向集合中添加觀察者以及刪除觀察者的方法,并且提供了一個向觀察者通知目標對象發生變化的notifyObservers()方法;在目標對象的具體實現中,有著目標對象的狀態屬性,當目標狀態發生改變時,觸發notifyObservers()方法,通知觀察者對象,使觀察者知道目標狀態已經發生改變。在觀察者對象中,有著update()方法,接收目標對象,在觀察者的具體實現中,有著觀察者狀態屬性observerstate,當observerState與得到通知的Subject的狀態一致的時候,將目標轉臺同步到觀察者的狀態中。查看全部
-
下面我們就來看看觀察者模式的組成部分。 1) 抽象目標角色(Subject):目標角色知道它的觀察者,可以有任意多個觀察者觀察同一個目標。并且提供注冊和刪除觀察者對象的接口。目標角色往往由抽象類或者接口來實現。 2) 抽象觀察者角色(Observer):為那些在目標發生改變時需要獲得通知的對象定義一個更新接口。抽象觀察者角色主要由抽象類或者接口來實現。 3) 具體目標角色(Concrete Subject):將有關狀態存入各個Concrete Observer對象。當它的狀態發生改變時, 向它的各個觀察者發出通知。 4) 具體觀察者角色(Concrete Observer):存儲有關狀態,這些狀態應與目標的狀態保持一致。實現Observer的更新接口以使自身狀態與目標的狀態保持一致。在本角色內也可以維護一個指向Concrete Subject對象的引用。查看全部
-
觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。查看全部
-
觀察者模式使用場合情況查看全部
-
觀察者模式的本質:觸發聯動查看全部
-
觀察者模式的缺點查看全部
-
觀察者模式的優點查看全部
-
Java.util.observable 方式推模型的具體寫法。查看全部
-
觀察者模式用例圖查看全部
-
觀察者模式的建立步驟查看全部
-
觀察者類所需的變量查看全部
-
觀察者模式查看全部
-
區別對待觀察者 即有些觀察者要求當更新的天氣預報信息為下雨才去通知它們,如果天氣晴朗就不需要通知.而不像其他觀察者一樣,不管天氣是否下雨還是晴天,都會去通知它們. 實現具體主題角色根據不同的狀態信息來選擇對部分觀察者進行通知功能,只需使用傳統方式. 在抽象觀察者接口中聲明一個獲取具體觀察者不需更新的內容的方法.方法返回字符串數組. 在具體觀察者中創建字符串數組存放不需要更新的信息內容,并實現方法,返回該數組. 在抽象主題角色使用推模式聲明notify()抽象方法,具體主題角色中實現notify()方法,方法中獲取具體主題角色的狀態信息,在遍歷觀察者列表時,判斷當前要更新的信息是否是觀察者需要的.如果符合,則對觀察者進行更新,不符合則不更新. 具體主題角色: public class ConcreteSubject extends Subject{ //存放狀態信息 private String state; public String void getState(){ return state; } public void setState(String state) { this.state = state; //使用拉模型 this.notifyObserver(); } public void notifyObserver(){ //獲取準備更新的內容. String Temp=this.getState(); //此標記用來判斷是否要更新,默認要. Boolean isUpdate=true; //循環遍歷觀察者 for(Observer observer:observers){ //循環遍歷觀察者不需要更新的內容. for(String arg: observer.getNoUpdate()){ if(Temp.equals(arg){ isUpdate=false; break; } } if(isUpdate){ observer.update(this); }else{ //重置更新標識為true. isUpdate=true; } } } }查看全部
-
何時使用觀察者模式: 觸發聯動概括了觀察者模式的本質. 當修改具體主題角色的狀態之后,就會觸發相應的通知,然后會循環調用所有注冊了的觀察者的更新方法. 建議在以下情況中選用觀察者模式: 1.當一個抽象模型有2個方面,其中一個方面的操作依賴于另一個方面的狀態變化. 2.如果在更改一個對象的時候,需要同時連帶改變其他的對象,而且不知道究竟應該有多少對象需要被連帶改變. 3.當一個對象必須通知其他的對象,但是你又希望這個對象和其他被通知的對象是松散耦合.查看全部
舉報
0/150
提交
取消