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

来源:互联网 发布:淘宝数据包里面是什么 编辑:程序博客网 时间:2024/05/21 15:42
情景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);

http://www.cnblogs.com/shijiacheng/p/5059067.html

4.RecyclerView中的addOnScrollListener方法

阅读全文
0 0