1.观察者模式介绍
观察者模式(Observer Pattern),是十一大行为型设计模式之一。
观察者模式是一个使用率非常高的模式,最常用于GUI系统,订阅发布系统。观察者模式最重要的作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。
2.观察者模式的定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
3.观察者模式的使用场景
1.关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系;
2.事件多级触发场景;
3.跨系统的消息交换场景,如消息队列,事件总线的处理机制。
4.UML类图
5.角色介绍
1.Subject:抽象主题,也就是被观察者(Observable)的角色,抽象主题角色把所有观察者对象的引用保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
2.ConcreteSubject:具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发出通知,具体主题角色又叫做具体被观察者(ConcreteObservable)角色。
3.Observer:抽象观察者,该角色是观察者的抽象类,它定义了一个更新接口,使得在得到主题的更改通知时跟新自己。
4.ConcreteObserver:具体的观察者,该角色实现抽象观察者角色所定义的更新接口,以便在主题的状态发生变化时更新自身的状态。
6.例子
例子分析
写一个继承Observable的被观察者类,写一个方法,里面直接调用系统父类Observable的setChanged方法和notifyObservers方法。再写一个实现Observer的观察者类。在客户端调用的时候,将观察者注册到被观察者对象的观察者列表中,就把被观察者和观察者关联了。
注意:必须写一个继承Observable的被观察者类,不然Observable里的方法调用无效。
7.Android源码中观察者模式
平时见到的ListView里的Adapter之类的都用到了观察者模式。
8.总结
观察者模式主要的作用就是对象解耦,将观察者与被观察者完全隔离,只依赖于Observer和Observable抽象,例如,ListView就是运用了Adapter和观察者模式使得它的可扩展性,灵活性非常强,而耦合度却很低,这是设计模式再Android源码中优秀运用的典范。
观察者模式优点:观察者和被观察者之间是抽象耦合,应对业务变化;增强系统灵活性,可扩展性。
观察者模式缺点:在应用观察者模式时需要考虑开发效率和运行效率问题,程序中包括一个被观察者,多个观察者,开发和调试等内容会比较复杂,而且在Java中消息的通知默认是顺序执行,一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般考虑采用异步的方式。
PS:读《Android源码设计模式解析与实战》中的观察者模式之后的一些笔记与感悟。