觀察者模式是一種使用頻率非常高的設計模式,最常用的地方就是訂閱-發布系統。
這個模式的重要作用就是將觀察者和被觀察者解耦,使他們之間的依賴更小甚至沒有。
定義物件一種一對多的依賴關係,使得每當乙個物件改變狀態,則所有依賴於他的物件都會得到通知並被自動更新。
訂閱模式就是個觀察者模式,訂閱後,被訂閱的有更新就會提示你。
先定義乙個訂閱者,實現更新方法。
public
class
user
implements
observer
@override
public
void
update(observable o, object arg)
}
定義乙個可觀察者,有變化時發布更新通知。
public
class
gamedaily
extends
observable
}
使用:
public
class client
}
輸出
通常在listview的內容變化時,我們會呼叫notifydatasetchanged()這個方法,然後listview裡面的資料就會進行更新。這個感覺就像是觀察者模式。listview在觀察者內容,內容變化發布通知之後listview就會更新資料。
看一下這個方法。
package android.widget;
public
abstract
class
baseadapter
implements
listadapter, spinneradapter
public
void
unregisterdatasetobserver(datasetobserver observer)
......
public
void
notifydatasetchanged()
......
}
這段**可以看到這應該是乙個觀察者模式,而且這個乙個被觀察者,裡面提供了註冊和登出觀察者以及通知觀察者的方法。
這些方法是通過datasetobservable這個類呼叫的:
package android.database;
public
class
datasetobservable
extends
observable }
}......
}
這個類繼承自observable,observable中有乙個protected final arraylist mobservers = new arraylist();,
用來儲存註冊的觀察者。mdatasetobservable.registerobserver(observer)和mdatasetobservable.unregisterobserver(observer)分別就是增加和刪除。
在notifychanged方法中,迴圈這個集合,呼叫每乙個觀察者的onchanged()方法。
那麼這些觀察者是什麼時候註冊的呢?也就是listview和adapter什麼時候成了訂閱關係。在listview的setadapter()中
public
class
listview
extends
abslistview
......
if (mheaderviewinfos.size() > 0|| mfooterviewinfos.size() > 0) else
......
super.setadapter(adapter);
if (madapter != null)
} else
requestlayout();}}
adapterdatasetobserver是listview的父類abslistview的內部類
package android.widget;
public
abstract
class
abslistview
extends
adapterview
implements
textwatcher,
viewtreeobserver.ongloballayoutlistener, filter.filterlistener,
viewtreeobserver.ontouchmodechangelistener,
remoteviewsadapter.remoteadapterconnectioncallback
}······}}
adapterdatasetobserver是adapterview.adapterdatasetobserver的子類,所以要看super.onchanged()
package android.widget;
public
abstract
class
adapterview
extends
adapter> extends
viewgroup else
checkfocus();
//重新布局
requestlayout();
}......}}
整理一下:當listview資料變化時,呼叫adapter的notifydatasetchange方法,這個方法呼叫datasetobservable的notifychanged方法,這個方法又會呼叫所有觀察者的onchanged方法,onchanged再呼叫重新布局view的方法,完成重新整理資料的功能。 python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...
設計模式 觀察者模式
觀察者模式定義了物件間一對多的依賴關係,乙個物件發生變化時,所有依賴它的物件都得到通知並被自動更新。本文主要闡述觀察者模式在分布式scada人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...
設計模式 觀察者模式
核心思想 註冊 通知 撤銷註冊 observer 將自己註冊到被觀察物件 subject 中,被觀察物件將觀察者存放在乙個容器 container 裡。被觀察物件發生了某種變化 如圖中的somechange 從容器中得到所有註冊過的觀察者,將變化通知觀察者。觀察者告訴被觀察者要撤銷觀察,被觀察者從容...