Android 最常用的设计模式三 安卓源码分析—Observer观察者模式

情景1

有一种短信服务,比如天气预报服务,一旦你订阅该服务,你只需按月付费,付完费后,每天一旦有天气信息更新,它就会及时向你发送最新的天气信息。



1.意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

/**
 * 我们来使用一下,我们定义了一个天气变换的主题,也就是被观察者,还有两个观察者观察天气变换,一旦变换了,就打印出天气信息,
 * 注意一定要调用被观察者的register进行注册,否则会收不到变换信息。
 * 而一旦不敢兴趣了,直接调用unregister方法进行取消注册即可
 */
public void ObserverTest(){

    //天气预报
    Observable<Weather> observable=new Observable<Weather>();


    Observer<Weather> observer1=new Observer<Weather>() {
        @Override
        public void onUpdate(Observable<Weather> observable, Weather data) {
            System.out.println("观察者1"+data.toString());
        }
    };
    Observer<Weather> observer2=new Observer<Weather>() {
        @Override
        public void onUpdate(Observable<Weather> observable, Weather data) {
            System.out.println("观察者2"+data.toString());
        }
    };

    //注册观察者
    observable.register(observer1);
    observable.register(observer2);


    //天气发生了改变,通知观察者,注册了的观察者就能收到相应的信息
    Weather weather=new Weather("晴转多云");
    observable.notifyObservers(weather);

    Weather weather1=new Weather("多云转阴");
    observable.notifyObservers(weather1);

    observable.unregister(observer1);

    Weather weather2=new Weather("台风");
    observable.notifyObservers(weather2);
}

/**
 * Created by Administrator on 2017/9/13.
 * 封装业务,观察者和被观察者的业务封装
 * 观察者:注册监听,谁注册谁能收到
 * 被观察者:有信息变化的时候通知观察者
 * 
 */

public class Observable <T>{

    List<Observer<T>> mObservers = new ArrayList<Observer<T>>();

    //注册
    public void register(Observer<T> observer) {
        if (observer == null) {
            throw new NullPointerException("observer == null");
        }
        synchronized (this) {
            if (!mObservers.contains(observer))
                mObservers.add(observer);
        }
    }

    /**反注册*/
    public synchronized void unregister(Observer<T> observer) {
        mObservers.remove(observer);
    }

    public void notifyObservers(T data) {
        for (Observer<T> observer : mObservers) {
            observer.onUpdate(this, data);
        }
    }

}


/**
 * Created by Administrator on 2017/9/13.
 * 观察者得到的更新接口
 */

public interface Observer <T> {

    void onUpdate(Observable<T> observable,T data);

}

public class Weather {


    public Weather(String description){
        this.description=description;
    }

    private String description;

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }


}

总结:
1.观察者(封装更新方法)
2.被观察者———转接桥梁(封装了注册和更新的方法)
3.事件(实体信息,内容)
4.观察者模式的三个典型方法它都具有,即注册,取消注册,发送事件
5.传输数据,有注册信息相关的组件就用到了观察者模式

安卓中用到的观察者模式

1.观察者模式:

电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。
比如说BaseAdapter AbsListView


我们可以通过BaseAdapter.registerDataSetObserver和BaseAdapter.unregisterDataSetObserver两方法来向BaseAdater注册、注销一个DataSetObserver。这个过程中,DataSetObserver就是一个观察者,它一旦发现BaseAdapter内部数据有变量,就会通过回调方法DataSetObserver.onChanged和DataSetObserver.onInvalidated来通知DataSetObserver的实现类。事件通知也是观察者模式

简介:一个对象发生改变时,所有信赖于它的对象自动做相应改变。


 
2.Android的广播机制LocalBroadcastManager

我们平时使用本地广播主要就是下面四个方法

LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(BroadcastReceiver receiver, IntentFilter filter);
localBroadcastManager.unregisterReceiver(BroadcastReceiver receiver);
localBroadcastManager.sendBroadcast(Intent intent)


3.EventBus

观察者模式的三个典型方法它都具有,即注册,取消注册,发送事件

EventBus.getDefault().register(Object subscriber);
EventBus.getDefault().unregister(Object subscriber);
EventBus.getDefault().post(Object event);


4.RecyclerView中的addOnScrollListener方法

猜你喜欢

转载自blog.csdn.net/WHB20081815/article/details/77970133
今日推荐