前言
观察者模式是一种最最为常见的设计模式,代码中基本会要用到这个。记录一下相关知识,方便自己回顾和查阅。
正文
观察者模式
观察者模式(Observer Pattern): 定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
观察者模式是一种对象行为型模式。
主要角色
目标(Subject)
被观察者,它是指被观察的对象。提供添加、删除和通知观察者的方法
具体目标(ConcreteSubject)
继承目标(Subject),实现具体业务逻辑。
观察者(Observer)
抽象观察者,观察主题目标的状态变化,实现 update()来更新自己的状态。
具体观察者(ConcreteObserver)
继承自抽象观察者,实现具体业务逻辑。
demo
目标
被观察者,它是指被观察的对象。提供添加、删除和通知观察者的方法
- public interface Subject {
- void addObserver(Observer observer);
- void removeObserver(Observer observer);
- void notifyObserver();
- }
具体目标
继承目标(Subject),实现具体业务逻辑。
- public class ConcreteSubject implements Subject {
- //只是简单测试,不涉及多线程
- private final List<Observer> list = new ArrayList<>();
-
-
- @Override
- public void addObserver(Observer observer) {
- if (null != observer) {
- list.add(observer);
- }
- }
-
- @Override
- public void removeObserver(Observer observer) {
- if (null != observer) {
- list.remove(observer);
- }
- }
-
- @Override
- public void notifyObserver() {
- for( Observer observer: list){
- observer.update();
- }
- }
- }
观察者
抽象观察者,观察主题目标的状态变化,实现 update()来更新自己的状态。
- public interface Observer {
- void update();
- }
具体观察者
继承自抽象观察者,实现具体业务逻辑。
- public class ConcreteObserver1 implements Observer{
- @Override
- public void update() {
- //收到更新通知,do something
- }
- }
- public class ConcreteObserver2 implements Observer{
- @Override
- public void update() {
- //收到更新通知,do something
- }
- }
客户端
- ConcreteObserver1 concreteObserver1 = new ConcreteObserver1();
- ConcreteObserver2 concreteObserver2 = new ConcreteObserver2();
- ConcreteSubject concreteSubject = new ConcreteSubject();
-
- concreteSubject.addObserver(concreteObserver1);
- concreteSubject.addObserver(concreteObserver2);
- //有更新,通知观察着
- concreteSubject.notifyObserver();
优缺点
优点
降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系
目标与观察者之间建立了一套触发机制
符合“开闭原则”的要求
缺点
目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用
当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率
课外知识
观察者模式在Android也是很常见的
ListView和Adapter监听数据变化
广播机制
EventBus
RxAndroid
参考文章
《》
《》
《
© 版权声明