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
- Android 最常用的设计模式三 安卓源码分析—Observer观察者模式
- Android 最常用的设计模式五 安卓源码分析——建造者模式
- Android 最常用的设计模式十一 安卓源码分析—— 代理模式(proxy)
- Android 最常用的设计模式十 安卓源码分析——策略模式(Strategy)
- Android 最常用的设计模式八 安卓源码分析—工厂方法模式factory
- Android 最常用的设计模式一 安卓源码分析—单例模式singleInstance
- Android 最常用的设计模式二 安卓源码分析——组合模式(component)
- Android 最常用的设计模式九 安卓源码分析—— 适配器模式(Adapter)
- Android 最常用的设计模式四 安卓源码分析——模板方法(Mould)
- 设计模式笔记——(三:观察者模式 Observer Pattern)
- 安卓常用的设计模式之观察者模式
- Android设计模式之观察者模式 Observer
- Android与设计模式——观察者(Observer)模式
- 观察者设计模式Observer
- 观察者设计模式(observer)
- observer(观察者设计模式)
- Observer(观察者)设计模式
- 设计模式——观察者模式 Observer
- 统计数组 arr 中值等于 item 的元素出现的次数
- JAVA 中数组的几种排序方法
- Reverse Integer
- 网络基础
- 加入强调语气,使用<strong>和<em>标签
- Android 最常用的设计模式三 安卓源码分析—Observer观察者模式
- Samba配置
- 吾八哥学Python(一):搭建Python开发环境(Windows)
- C++l里this指针的一个用处
- 用户身份切换
- [LeetCode]141. Linked List Cycle
- 威佐夫博弈
- YOLOV2
- angular+做一个购物车可以删除,计算总额