模式简介
-
观察者模式用于定义对象之间的一对多依赖
当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态
-
观察者模式的角色
主题(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