前言
观察者模式是一种最最为常见的设计模式,代码中基本会要用到这个。记录一下相关知识,方便自己回顾和查阅。
正文
观察者模式
观察者模式(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
参考文章
《》
《》
《
© 版权声明