观察者模式
1. 定义
观察者模式旨在描述如下行为:即一个对象的状态或者行为的变化将导致其他对象的状态或者行为也发生变化,他们之间将产生联动。为了更好地描述对象之间这种一对多(一对一)的联动,观察者模式应运而生,其定义了对象之间一种一对多的依赖关系,让一个对象的改变能够影响其他对象。
- Publish/ subscribe
- Model/ View
- Source/ Listener
2. 概述
- subject
- 被观察的对象
- 在subject当中定义了一个观察者的集合
- 一个观察目标可以接受任意数量的观察者来观察
- 定义了通知方法notify()
- concreteSubject
- 具体目标,目标类的子类
- 通常包含经常发生改变的数据,当其状态发生改变的时候,向它的各个观察者发出通知;同时它还实现了在目标类当中定义的抽象业务逻辑方法。
- observer
- 观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update()
- concreteObserver
- 在具体观察者中维护一个指向具体目标的对象的引用,存储具体观察者的有关状态。这些状态需要和具体目标的状态保持一致,实现了update()方法。
import java.util.*;
abstract class Subject {
//定义一个观察者集合用于存储所有观察者对象
protected ArrayList<Observer> observers= new ArrayList();
//注册方法,用于向观察者集合中增加一个观察者
public void attach(Observer observer) {
observers.add(observer);
}
//注销方法,用于在观察者集合中删除一个观察者
public void detach(Observer observer) {
observers.remove(observer);
}
//声明抽象通知方法
public abstract void notify();
}
class ConcreteSubject extends Subject {
//实现通知方法
public void notify() {
//遍历观察者集合,调用每一个观察者的响应方法
for(Object obs:observers) {
((Observer)obs).update();
}
}
}
interface Observer {
//声明响应方法
public void update();
}
class ConcreteObserver implements Observer {
//实现响应方法
public void update() {
//具体响应代码
}
}
3. JDK对观察者模式的支持
- Observable 类
- 定义了一个List来存储观察者对象
- addObserver(Observer o)
- deleteObserver(Observer o)
- notifyObservers()
- deleteObservers()
- setChanged()
- clearChanged()
- hasChanged()
- countObservers()
Observer接口还有Observable类可以直接作为观察者模式的抽象层,再自定义具体观察者类和具体的观察目标类。
4. Review
- 优点
- 实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口
- 在观察目标和观察者之间建立一个抽象的耦合
- 观察目标只需要维持一个抽象观察者的集合,无须了解其具体的观察者
- 缺陷
- 太多观察者,都通知很耗时的
Reference
- https://blog.csdn.net/lovelion/article/details/7720232
- https://blog.csdn.net/LoveLion/article/details/7720490
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com
文章标题:观察者模式
文章字数:728
本文作者:Leilei Chen
发布时间:2020-02-03, 06:59:28
最后更新:2020-02-04, 11:23:25
原始链接:https://www.llchen60.com/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。