定义
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
结构
观察者模式的通用类图:
Subject被观察者
定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。
Observer观察者
观察者接收到消息后,即进行update (更新方法)操作,对接收到的信息进行处理。
ConcreteSubject具体的被观察者
定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。
ConcreteObserver具体的观察者
每个观察在接收到消息后的处理反应是不同,各个观察者有自己的处理逻辑。
实现
被观察者
import java.util.Vector;
public abstract class Subject {
private Vector<Observer> obsVector = new Vector<>();//Vector线程同步
public void addObserver(Observer o) {
obsVector.add(o);
}
public void delObserver(Observer o) {
obsVector.remove(o);
}
public void notifyObservers() {
for(Observer o : obsVector)
o.update();
}
}
具体被观察者
public class ConcreteSubject extends Subject {
public void doSomething() {
System.out.println("被观察者有动作!");
notifyObservers();
}
}
观察者
public interface Observer {
void update();
}
具体观察者
public class ConcreteObserver implements Observer {
@Override
public void update() {
System.out.println("观察者发现被观察者有举动!");
}
}
测试
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer = new ConcreteObserver();
subject.addObserver(observer);
subject.doSomething();
}
}
输出
JDK自带也有观察者模式,在util包里,不过在jdk9以后就弃用了。
应用场景
对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
优缺点
优点:
- 观察者与被观察者是抽象耦合,容易扩展
- 目标与观察者之间建立了一套触发机制。
缺点:
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。