《Android源码设计模式解析与实战》读书笔记(十二)——观察者模式
来源:互联网 发布:js 获取特定属性值 编辑:程序博客网 时间:2024/05/27 02:29
观察者模式,当我刚看到这个模式的名字时首先想到的就是Rxjava,看来也是时候正儿八经的学学Rxjava了。观察者模式是一个使用率非常高的模式,它最常用的地方就是GUI系统(图形操作界面),观察者模式的一大作用就是解耦,将被观察者和观察者解耦,使它们之间的依赖性更小,甚至毫无依赖。对GUI系统来说,观察者模式的目的就是将UI层与具体的业务逻辑解耦。
第十二章 解决、解耦的钥匙——观察者模式
1.定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。
2.使用场景
1).关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”的。
2).事件多级触发场景。
3).跨系统的消息交换场景,如消息队列、事件总线的处理机制。
3.简单实现
如果我们订阅了一本杂志,例如《读者》,那么每次《读者》发布新刊的时候,我们都会收到通知,即新杂志。而且,并不是只有我们收到,所有订阅了《读者》的朋友都会收到。这就形成了一对多的关系,《读者》杂志就是被观察者,所有订阅它的人都是观察者。
定义一个订阅者类,实现Observer接口:
public class Subscriber implements Observer { //简单定义一个属性,用来区分是不同的观察者 private String name; public Subscriber(String name) { this.name = name; } @Override public void update(Observable observable, Object o) { System.out.println(name + "收到了新一期的读者杂志"); }}
定义《读者》杂志类,继承Observable类,里面就一个简单的退出新刊的方法:
public class Reader extends Observable { public void pushNewReader() { //标识状态或内容发生改变 setChanged(); //通知所有观察者 notifyObservers(); }}
然后在MainActivity中调用:
Subscriber mSubscriber1 = new Subscriber("张三"); Subscriber mSubscriber2 = new Subscriber("李四"); Subscriber mSubscriber3 = new Subscriber("王麻子"); Reader mReader = new Reader(); mReader.addObserver(mSubscriber1); mReader.addObserver(mSubscriber2); mReader.addObserver(mSubscriber3); mReader.pushNewReader();
可以看到三个订阅者都收到了新刊。
需要注意的是,重写的 update() 方法中有两个参数,一个 Observable ,指的当然就是被观察者,还有一个 Object 类型的参数,也就是说,被观察者还能传参数过来。 Observable 中的 notifyObservers() 方法有两个重载,一个是无参的 notifyObservers() ,还有一个可以传 Object 的 notifyObservers(Object o) 重载。
还有一点,我在运用观察者模式的时候发现执行 update() 方法的线程跟执行 notifyObservers() 方法的线程是同一个线程。
4.总结
其实感觉观察者模式就跟广播类似,一个地方发送广播,所有注册了该广播的广播接收者都能收到,书中还多次提到事件总线,这也是一个实现了事件订阅者和事件发布者解耦的框架,所以 EventBus 和 Rxjava 都会列入我的学习范围。
观察者模式的主要作用就是对象解耦,将观察者和被观察者完全隔离开来,只依赖于 Observable 和 Observer。
优点:
1).观察者和被观察者之间是抽象耦合,应对业务变化。
2).增强系统灵活性,可扩展性。
缺点:
1).观察者模式需要考虑一下开发效率和运行效率,程序中有一个被观察者和多个观察者,开发和调试都比较复杂,而且 Java 中的消息通知默认是顺序执行的,所以一个观察者卡顿,可能会影响程序整体的执行效率,在这种情况下,一般都考虑异步的方式。
Demo下载
- 《Android源码设计模式解析与实战》读书笔记(十二)——观察者模式
- 《Android源码设计模式解析与实战》读书笔记(二十二)——享元模式
- 《Android源码设计模式解析与实战》读书笔记(十二)
- 《Android源码设计模式解析与实战》读书笔记(十二)
- 《Android源码设计模式解析与实战》读书笔记(二十二)
- 《Android源码设计模式解析与实战》读书笔记(二十二)
- 《Android源码设计模式解析与实战》读书笔记(二)——单例模式
- 《Android源码设计模式解析与实战》读书笔记(三)——建造者模式
- 《Android源码设计模式解析与实战》读书笔记(四)——原型模式
- 《Android源码设计模式解析与实战》读书笔记(五)——工厂方法模式
- 《Android源码设计模式解析与实战》读书笔记(七)——策略模式
- 《Android源码设计模式解析与实战》读书笔记(八)——状态模式
- 《Android源码设计模式解析与实战》读书笔记(九)——责任链模式
- 《Android源码设计模式解析与实战》读书笔记(十)——解释器模式
- 《Android源码设计模式解析与实战》读书笔记(十一)——命令模式
- 《Android源码设计模式解析与实战》读书笔记(六)——抽象工厂模式
- 《Android源码设计模式解析与实战》读书笔记(十三)——备忘录模式
- 《Android源码设计模式解析与实战》读书笔记(十四)——迭代器模式
- 使用JavaMail创建邮件和发送邮件
- windows编译lua
- 收藏的几个容易出错的面试题
- JAVA基础入门
- JSP中图片的设置
- 《Android源码设计模式解析与实战》读书笔记(十二)——观察者模式
- Google 官方推出应用开发架构指南
- HashMap实现原理学习
- 总结自己在spring中遇到的各个注解的含义
- android studio 快捷键
- JAVA中的数据类型和方法重载
- BroadcastReceiver全面解析
- 2017年技术和生活的目标
- 海康威视摄像头忘记密码后如何重置