使用率很高油宜,常常用于GUI系統(tǒng)希痴、訂閱-發(fā)布系統(tǒng)者甲,他講觀察者與被觀察者進行解耦。
定義:是一種一對多的關(guān)系砌创,當一個對象狀態(tài)改變虏缸,依賴與他的其他對象就會得到通知,并且更行嫩实。
使用場景:
1.關(guān)聯(lián)行為場景刽辙,注意關(guān)聯(lián)行為是可拆分的,而不是‘組合’關(guān)系甲献。
2.時間多級出發(fā)機制
3.跨系統(tǒng)的消息交換場景宰缤,如消息隊列,事件總線的處理機制晃洒。
結(jié)構(gòu):
Subject類:抽象的被觀察者慨灭,把所有的觀察者存儲在一個集合里。
ConcreteSubject:具體被觀察者類球及,內(nèi)部狀態(tài)改變時氧骤,給所有注冊過的觀察者發(fā)送消息。
Observer:抽象觀察者吃引,定義了一個借口筹陵,使得在得到主題的更改通知時更新自己刽锤。
ConcreteObserver:實現(xiàn)了接口方法。
Android 源碼:
listView的notifyDataSetchanged方法朦佩,這個方法定義在BaseAdapter中并思。
BaseAdapter里面有一個成員變量mDataSetOvservable,當我們調(diào)用notifyDataSetChanged的時候语稠,其實調(diào)用了mDataSetOvservable.notifyChanged()纺荧。
而這個方法里面進行了一個循環(huán),遍歷mObservers颅筋,調(diào)用onChanged()方法宙暇。
這些觀察者是ListView通過setAdapter方法設(shè)置Adapter產(chǎn)生的,在設(shè)置Adapter的時候會構(gòu)建一個AdapterDataSetObserver议泵,然后注冊到adapter中占贫。
onchange方法中調(diào)用requestLayout()方法對listview進行重新布局。