Android中自帶的觀察者模式

什么是觀察者模式?

  • 觀察者模式定義了對象間的一種一對多依賴關系,使得每當一個對象改變狀態,則所有依賴于它的對象都會得到通知并被自動更新。
  • 觀察者采用了“注冊---通知---撤銷注冊”的形式
  • Android中包含了對應觀察者模式的兩個類:DataSetObserver和DataSetObservable。

觀察者和被觀察者為了避免混淆這兩個概念,給他倆取個別名:

  • 觀察者 = 響應者;
  • 被觀察者 = 改變者;

DataSetObserver:觀察者,響應者

public abstract class DataSetObserver {
    /**
     * This method is called when the entire data set has changed,
     * most likely through a call to {@link Cursor#requery()} on a {@link Cursor}.
     */
    public void onChanged() {
        // Do nothing
    }
    /**
     * This method is called when the entire data becomes invalid,
     * most likely through a call to {@link Cursor#deactivate()} or {@link Cursor#close()} on a
     * {@link Cursor}.
     */
    public void onInvalidated() {
        // Do nothing
    }
}

這里面提供了兩個方法:

  • onChanged():當被改變者發生了改變,會調用這個方法來通知響應者
  • onInvalidated():當所有的數據都失效時,被調用;

DataSetObservable:被觀察者,改變者

public class DataSetObservable extends Observable<DataSetObserver> {
    /**
     * Invokes {@link DataSetObserver#onChanged} on each observer.
     * Called when the contents of the data set have changed.  The recipient
     * will obtain the new contents the next time it queries the data set.
     */
    public void notifyChanged() {
        synchronized(mObservers) {
            // since onChanged() is implemented by the app, it could do anything, including
            // removing itself from {@link mObservers} - and that could cause problems if
            // an iterator is used on the ArrayList {@link mObservers}.
            // to avoid such problems, just march thru the list in the reverse order.
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }
    /**
     * Invokes {@link DataSetObserver#onInvalidated} on each observer.
     * Called when the data set is no longer valid and cannot be queried again,
     * such as when the data set has been closed.
     */
    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onInvalidated();
            }
        }
    }
}

這里面依然有兩個方法,與相應者中的兩個方法一一對應

  • notifyChanged():改變者發生了變化,調用這個方法去通知所用已經注冊的響應者,并依次調用響應者的onChanged()方法。
  • notifyInvalidated():當數據集合失效或者不再使用的時候,調用這個方法通知所有的響應者,并調用他們的onInvalidated()方法。

改變者繼承了Observable,并且泛型傳入DataSetObserver。這個Observable類很簡單,就是提供了一個響應者的注冊集合ArrayList<T> mObservers。提供了個方法:

  • public void registerObserver(T observer):注冊一個響應者;
  • public void unregisterObserver(T observer):移除一個已經注冊響應者;
  • public void unregisterAll():移除所有已經注冊的;

觀察者模式的使用方式

  1. 繼承DataSetObserver,并實現其中的兩個方法,加入你希望在數據發生變化后的響應事件。
  2. 定義一個DataSetObservable改變者對象。這個對象不需要重寫方法,只是用來注冊和解除注冊。
  3. 定義一個重寫的DataSetObserver對象,并在初始化的時候,調用mObservable.registerObserver(observer);去注冊
  4. 在你的數據發生變化的時候,調用改變著的notifyChanged()方法去通知響應者;
  5. 在使用結束后,調用改變者的unregisterObserver(observer)解除注冊;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容