重温观察者模式:Android里很常用的模式之一
2016-06-15 16:12
555 查看
今天在看rxJava的时候发现又是使用的观察者模式,这个模式在android开发里面使用频率挺高的,思想是知道的,还是觉得按照自己的理解用代码再写一遍加深一下认识比较好
不单是rxJava,EventBus,安卓里面的adapter,ContentProvider等等都使用到这个模式。
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
有了这图基本代码就可以写了,其他不多说直接上代码
用一个小例子使用起来看看
3个观察者都收到
其实思想挺简单的,写完自己的代码,再去翻翻别人SDK里源码是怎么写的,看看有没有什么惊喜
拿我们最熟悉的BaseAdapter开刀
红色的部分是不是很熟悉,BaseAdapter里面藏有一个被观察者,再点进去看看怎么写的
基本一样就是使用的是一个泛型抽象类,我们用的是接口,还有抛出的异常不一样抛IllegalStateException比较符合
再进去看一下具体实现类找到了我们最熟悉的notifyDataSetChanged的实现notifyChanged方法,主要也是遍历调用
被观察者看完了,再看看观察者,点进去那个DataSetObserver看看,其实里面基本就是一个改变的方法
好adapter的隐私窥探完了,观察者模式先写到这里,有兴趣的自己去看看其他的实现
不单是rxJava,EventBus,安卓里面的adapter,ContentProvider等等都使用到这个模式。
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
有了这图基本代码就可以写了,其他不多说直接上代码
/** * Created by roman on 2016/6/15. * 观察者 */ public interface Observer { /** * 收到通知的响应 * @param text */ void update(String text); }
/** * Created by roman on 2016/6/15. * 具体观察者 */ public class ConcreteObserver implements Observer { @Override public void update(String text) { Log.d("ConcreteObserver", "收到" + text + "通知!!!"); } }
/** * Created by roman on 2016/6/15. * 被观察者 */ public interface Subject<T extends Observer> { /** * 注册观察者 * @param observer */ void registerObserver(T observer); /** * 反注册观察者 * @param observer */ void unRegisterObserver(T observer); /** * 通知所有观察者变化 */ void notifyObservers(String msg); }
/** * Created by roman on 2016/6/15. * 具体被观察者 */ public class ConcreteSubject<T extends Observer> implements Subject<T> { //所有观察者 private List<T> observerList = new ArrayList<>(); @Override public void registerObserver(T observer) { synchronized (observerList) { if (observer != null && !observerList.contains(observer)) { observerList.add(observer); } else { throw new RuntimeException("register observer error"); } } } @Override public void unRegisterObserver(T observer) { synchronized (observerList) { if (observer != null && observerList.contains(observer)) { observerList.remove(observer); } else { throw new RuntimeException("unRegister observer error"); } } } @Override public void notifyObservers(String msg) { synchronized (observerList) { for (T observer : observerList) { observer.update(msg); } } } }
用一个小例子使用起来看看
/** * 观察者模式demo */ public class ObserverActivity extends AppCompatActivity { //老师在讲台告诉全班学生下午放假的通知 private Subject<Observer> mTeacher = new ConcreteSubject<>(); private Observer mStudent1 = new ConcreteObserver(); private Observer mStudent2 = new ConcreteObserver(); private Observer mStudent3 = new ConcreteObserver(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_observer); mTeacher.registerObserver(mStudent1); mTeacher.registerObserver(mStudent2); mTeacher.registerObserver(mStudent3); mTeacher.notifyObservers("同学们今天儿童节下午放假");//告诉 mTeacher.unRegisterObserver(mStudent1); mTeacher.unRegisterObserver(mStudent2); mTeacher.unRegisterObserver(mStudent3); } }
3个观察者都收到
其实思想挺简单的,写完自己的代码,再去翻翻别人SDK里源码是怎么写的,看看有没有什么惊喜
拿我们最熟悉的BaseAdapter开刀
红色的部分是不是很熟悉,BaseAdapter里面藏有一个被观察者,再点进去看看怎么写的
基本一样就是使用的是一个泛型抽象类,我们用的是接口,还有抛出的异常不一样抛IllegalStateException比较符合
再进去看一下具体实现类找到了我们最熟悉的notifyDataSetChanged的实现notifyChanged方法,主要也是遍历调用
被观察者看完了,再看看观察者,点进去那个DataSetObserver看看,其实里面基本就是一个改变的方法
好adapter的隐私窥探完了,观察者模式先写到这里,有兴趣的自己去看看其他的实现
相关文章推荐
- Android 五大布局
- android 修改viewpager切换速度
- 欢迎交流,这样骚扰我!
- Android属性动画的基本使用
- android 6.0上getResources.getColor遭弃用
- android:excludefromRecents属性控制在不在recent列表中显示
- Android 如何判断一个应用在运行
- RecyclerView 滑动删除与拖动的实现
- Android studio版本控制之配置忽略文件
- Android传递Parcelable时忽略的一个细节
- [Android学习]Fragment粗浅入门
- Android--Retrofit浅入深出
- Android--侧滑菜单应用的实现
- Android利用Intent实现记事本功能(NotePad)
- android studio 混淆打包
- Android Studio 快捷键
- Android之乐学成语
- android 4.4.系统 添加一门新的语言
- android的ViewPager实现伪循环效果
- android 中导入第三方jar包