感想:最近感覺到Interface真是個(gè)偉大的東西老翘!
最近看android message代碼的時(shí)候,發(fā)現(xiàn)有個(gè)CursorAdapter這個(gè)東西铺峭,蠻冷門的,然后看到了這篇文章[Cursor,CursorAdapter中的觀察者模式解析][1]傀履,發(fā)現(xiàn)自己需要惡補(bǔ)一下設(shè)計(jì)模式莉炉,于是便有了這篇文章的誕生。
正題
觀察者模式梆暮。首先我們得明確觀察者模式的定義绍昂,即:對象間的一種一對多的依賴關(guān)系,當(dāng)一個(gè)對象的狀態(tài)發(fā)送改變時(shí)窘游,所有依賴于它的對象都能得到通知并被自動更新
觀察者模式中的角色
- 觀察者忍饰,我們稱它為Observer,有時(shí)候我們也稱它為訂閱者艾蓝,即Subscriber
- 被觀察者,我們稱它為Observable餐曹,即可以被觀察的東西敌厘,有時(shí)候還會稱之為主題朽合,即Subject
具體原理
其實(shí)就是一個(gè)利用接口實(shí)現(xiàn)多態(tài)曹步,然后用定義一個(gè)list存放實(shí)現(xiàn)這些接口的類,通知時(shí)遍歷鏈表挨個(gè)通知就行了讲婚,而具體的Observable中,需要實(shí)現(xiàn)register活合,unregister,notify方法留晚,便完成了最觀察者模式的基本告嘲。
貼上實(shí)現(xiàn)的Observable類,可以簡單的看出橄唬,被觀察者是怎么實(shí)現(xiàn)的仰楚,而觀察者的實(shí)現(xiàn)就很簡單了,完成一個(gè)Observer接口即可缸血。我們同時(shí)貼上Observer接口;
public class Observable<T> {
List<Observer<T>> mObservers = new ArrayList<Observer<T>>();
public void register(Observer<T> observer) {
if (observer == null) {
throw new NullPointerException("observer == null");
}
synchronized (this) {
if (!mObservers.contains(observer))
mObservers.add(observer);
}
}
public synchronized void unregister(Observer<T> observer) {
mObservers.remove(observer);
}
public void notifyObservers(T data) {
for (Observer<T> observer : mObservers) {
observer.onUpdate(this, data);
}
}
}
public interface Observer<T> {
void onUpdate(Observable<T> observable,T data);
}
觀察者模式在android中的應(yīng)用
原來我以為button.setOnClickListener就是觀察者,其實(shí)并不是笆豁,只是一個(gè)回調(diào),但更深層次來看煞赢,的確是訂閱了我們的觸摸事件哄孤,應(yīng)該是觀察者模式啊,但實(shí)際上觀察者模式OnClickListener只是給該view設(shè)置了該方法而已凝危,其view本身就訂閱觸了摸事件晨逝,并不是因?yàn)槲覀僺etOnClickListener了,我們才訂閱了觸摸事件的捉貌。當(dāng)然冬念,這只是我的理解刘急,
而且view類中浸踩,可不是set listener了,而是add-xxx-Listener检碗,想到add,我發(fā)現(xiàn)另假,有點(diǎn)剛剛的觀察者模式的影子怕犁。
我們先看android中的一個(gè)標(biāo)準(zhǔn)觀察者模式,注冊broadcastReceiver戈轿,灰常明顯阵子,就是訂閱一個(gè)事件。
先看看我們正常是怎么注冊Receiver的色乾。
registerReceiver()
其實(shí)該函數(shù)的由來應(yīng)該是
LocalBroadcastManager.getInstance(this).registerReceiver(BroadcastReceiver
receiver, IntentFilter filter);
我們發(fā)現(xiàn)领突,就是一個(gè)觀察者模式,注冊一個(gè)觀察者君旦。
android SDK其他地方也也有很多觀察者模式,希望大家多多發(fā)現(xiàn)于宙,可以評論在下方悍汛。