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)解除注册;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值