安卓設計模式 觀察者模式

2021-08-11 21:04:52 字數 3119 閱讀 1327

觀察者模式是一種使用頻率非常高的設計模式,最常用的地方就是訂閱-發布系統。

這個模式的重要作用就是將觀察者和被觀察者解耦,使他們之間的依賴更小甚至沒有。

定義物件一種一對多的依賴關係,使得每當乙個物件改變狀態,則所有依賴於他的物件都會得到通知並被自動更新。

訂閱模式就是個觀察者模式,訂閱後,被訂閱的有更新就會提示你。

先定義乙個訂閱者,實現更新方法。

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 從容器中得到所有註冊過的觀察者,將變化通知觀察者。觀察者告訴被觀察者要撤銷觀察,被觀察者從容...