观察者模式用于定义对象之间的一对多依赖
当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态
观察者模式的角色
主题(Subject):被观察的对象
观察者(Observer):依赖被观察对象的其他对象
主题和观察者接口
// 主题
public interface Subject {
void add(Observer observer);
void remove(Observer observer);
void notice(String message);
}
// 观察者
public interface Observer {
void update(String msg);
}
报警器类
public class Alarm implements Subject {
private final String name;
private final Set<Observer> observers = new HashSet<>();
public Alarm(String name) {
this.name = name;
}
@Override
public void add(Observer observer) {
observers.add(observer);
}
@Override
public void remove(Observer observer) {
observers.remove(observer);
}
@Override
public void notice(String message) {
System.out.println(name + "发布了消息:" + message);
observers.forEach(observer -> observer.update(message));
}
}
操作员类
public class Operator implements Observer {
private final String name;
public Operator(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + "收到了通知:" + message);
}
}
测试
public class ObserverPatternTest {
@Test
public void test() {
Alarm alarm = new Alarm("温度报警器");
Operator operator0 = new Operator("操作员0");
Operator operator1 = new Operator("操作员1");
alarm.add(operator0);
alarm.add(operator1);
alarm.notice("温度 37.5,超标了");
alarm.remove(operator1);
alarm.notice("温度 36.5,太低了");
}
}
输出
温度报警器发布了消息:温度 37.5,超标了
操作员1收到了通知:温度 37.5,超标了
操作员0收到了通知:温度 37.5,超标了
温度报警器发布了消息:温度 36.5,太低了
操作员0收到了通知:温度 36.5,太低了
UML
观察者模式主要用于在关联行为之间建立一套触发机制的场景
应用举例
JDK: java.util.Observer, java.util.EventListener
Spring: ApplicationEvent