編輯:Android開發實例
觀察者模式,是一種非常常見的設計模式,在很多系統中隨處可見,尤其是涉及到數據狀態發生變化需要通知的情況下。
本文以AbstractCursor為例子,展開分析。
觀察者模式,Observer Pattern,是一個很實用的模式,本人曾經接觸到的各種平台以及曾經參與項目中打印模板解釋器中都用到了此模式。
1.意圖
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
熱門詞匯:依賴 發布-訂閱 事件 通知 更新 監聽
2.結構
這是一個最簡單的觀察者模式,目標對象能夠添加和刪除觀察者,當自己某種狀態或者行為發生改變時,可通過notify通知注冊的觀察者進行更新操作。
分析AbstractCursor的具體情況,我們發現實際工作有時需要對觀察者進行統一管理,甚至觀察者類型有很多種而又可以分成幾個系列,這個時候是要復雜的多,通過合理的分層這個問題很好解決。下面根據具體情況,我們畫出android中abstractCurosr中用到的觀察者模式結構圖:
觀察者分成了兩個系列。
3.代碼
列舉其中相關核心代碼如下:
public abstract class AbstractCursor {
//定義管理器
DataSetObservable mDataSetObservable = new DataSetObservable();
ContentObservable mContentObservable = new ContentObservable();
//注冊和卸載兩類觀察者
public void registerContentObserver(ContentObserver observer) {
mContentObservable.registerObserver(observer);
}
public void unregisterContentObserver(ContentObserver observer) {
// cursor will unregister all observers when it close
if (!mClosed) {
mContentObservable.unregisterObserver(observer);
}
}
public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}
public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}
//2類通知方法
protected void onChange(boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange);
if (mNotifyUri != null && selfChange) {
mContentResolver.notifyChange(mNotifyUri, mSelfObserver);
}
}
}
protected void notifyDataSetChange() {
mDataSetObservable.notifyChanged();
}
}
再看看Observable<T>類和DataSetObservable類:
public abstract class Observable<T> {
/**
* 觀察者列表
*/
protected final ArrayList<T> mObservers = new ArrayList<T>();
public void registerObserver(T observer) {
if (observer == null) {
throw new IllegalArgumentException("The observer is null.");
}
synchronized(mObservers) {
if (mObservers.contains(observer)) {
throw new IllegalStateException("Observer " + observer + " is already registered.");
}
mObservers.add(observer);
}
}
public void unregisterObserver(T observer) {
if (observer == null) {
throw new IllegalArgumentException("The observer is null.");
}
synchronized(mObservers) {
int index = mObservers.indexOf(observer);
if (index == -1) {
throw new IllegalStateException("Observer " + observer + " was not registered.");
}
mObservers.remove(index);
}
}
public void unregisterAll() {
synchronized(mObservers) {
mObservers.clear();
}
}
}
和
public class DataSetObservable extends Observable<DataSetObserver> {
/**
* 數據發生變化時,通知所有的觀察者
*/
public void notifyChanged() {
synchronized(mObservers) {
for (DataSetObserver observer : mObservers) {
observer.onChanged();
}
}
}
//... ... (其他方法)
}
觀察者DataSetObserver類是一個抽象類:
public abstract class DataSetObserver {
public void onChanged() {
// Do nothing
}
}
所以我們具體看它的子類:
public class AlphabetIndexer extends DataSetObserver{
/*
* @hide 被android系統隱藏起來了
*/
@Override
public void onChanged() {
//觀察到數據變化,觀察者做自己該做的事情
super.onChanged();
mAlphaMap.clear();
}
}
ContentObserver也是類似。
4.效果
(1).行為型模式
(2).目標和觀察者間的抽象耦合(經典實現)。
(3).支持廣播通信(相信這點android開發者看到後應該有啟發吧)。
(4).注意意外的更新,這也是觀察者更新進行管理的原因之一。
Android Clipboard(復制/剪貼板)
Android提供的剪貼板框架,復制和粘貼不同類型的數據。數據可以是文本,圖像,二進制流數據或其它復雜的數據類型。Android提供ClipboardManager、Cl
Android編程實現自定義進度條顏色的方法
本文實例講述了Android編程實現自定義進度條顏色的方法。分享給大家供大家參考,具體如下: android 自定義進度條顏色 先看圖 基於產品經理各種自定義需
基於Android 實現圖片平移、縮放、旋轉同時進行
前言 之前因為項目需求,其中使用到了圖片的單擊顯示取消,圖片平移縮放功能,昨天突然想再加上圖片的旋轉功能,在網上看了很多相關的例子,可是沒看到能同時實現我想要的功
Android之PreferenceActivity應用詳解(2)
看到很多書中都沒有對PreferenceActivity做介紹,而我正好又在項目中用到,所以就把自己的使用的在這總結一下,也方便日後查找。 PerferenceA