当前位置:操作系统 > 安卓/Android >>

Android 设计模式 之 观察者模式

[java] 
/*
 * 观察者模式
 *      定义对象间的一种一个(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的
 * 对象都得到通知并被自动更新
 * 
 * 当然,MVC只是Observer模式的一个实例。Observer模式要解决的问题为:
 * 建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,
 * 依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,
 * 我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。
 * 这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。
 * Observer模式就是解决了这一个问题。
 * 
 * 适用性:
 *      1. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面
 *      将这两者封装成独立的对象中以使它们可以各自独立的改变和服用
 * 
 *      2. 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
 * 
 *      3. 当一个对象必须通知其它对象,而它又不能假定其它对象是谁
 * 
 * 参与者:
 *      1. Subject(目标)
 *      目标知道它的观察者,可以有任意多个观察者观察同一个目标
 *      提供注册和删除观察者对象的接口
 * 
 *      2. Observer(观察者)
 *      为那些在目标发生改变时需获得通知的对象定义个更新的接口
 * 
 *      3. ConcreteSubject(具体目标)
 *      将有关状态存入各ConcreteObserver对象
 *      当它的状态发送改变时,向它的各个观察者发出通知
 * 
 *      4. ConcreteObserver(具体观察者)
 *      维护一个指向ConcreteObserver对象的引用
 *      存储有关状态,这些状态应与目标的状态保持一致
 *      实现Observer的更新接口是自身状态与目标的状态保持一致
 *      
 * 
 * */ 

有空我将把UML图补上。

下面看看Android使用到的观察者模式.
观察者(DataSetObserver),目标(Observable<T>),具体目标(DataSetObserverable)
Observer(观察者),DataSetObserver抽象2个方法,一个是观察数据改变的方法,一个是观察数据变成无效(或者不可用)时的方法。
源码路径:framework/base/core/java/android/database/DataSetObserver.java
[java] 
package android.database; 
 
/**
 * Receives call backs when a data set has been changed, or made invalid. The typically data sets
 * that are observed are {@link Cursor}s or {@link android.widget.Adapter}s.
 * DataSetObserver must be implemented by objects which are added to a DataSetObservable.
 */ 
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 
    } 

Subject(目标),Observable<T>是一个泛型的抽象类,主要功能是注册和撤销observer。
源码路径:framework/base/core/java/android/database/Observable.java
[java] 
package android.database; 
 
import java.util.ArrayList; 
 
/**
 * Provides methods for (un)registering arbitrary observers in an ArrayList.
 */ 
public abstract class Observable<T> { 
    /**
     * The list of observers.  An observer can be in the list at most
     * once and will never be null.
     */ 
    protected final ArrayList<T> mObservers = new ArrayList<T>(); 
 
    /**
     * Adds an observer to the list. The observer cannot be null and it must not already
     * be registered.
     * @param observer the observer to register
     * @throws IllegalArgumentException the observer is null
     * @throws IllegalStateException the observer is already registered
     */ 
    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); 
        } 
    } 
 
    /**
     * Removes a previously registered observer. The observer must not be null and it
     * must already have been registered.
     * @param observer the observer to unregister
     * @throws IllegalArgumentException the observer is null
     * @throws IllegalStateException the observer is not yet registered
     */ 
    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 registe

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,