在Java城,每天都有无数事件发生:
🔥 服务器过热!
💧 数据库水位告急!
⚡ 高并发请求突袭!
但问题来了:
"运维小哥、监控系统、告警机器人、日志中心......这么多人关心同一件事,难道要一个个打电话通知?"
这时,一位神秘女子站在城市高塔之巅,轻轻按下腕表------
全城警报同步响起!
她就是------Watcher女侠!
💬 "我不主动找你,但只要你订阅我,任何风吹草动,你立刻知道。"
📡 核心思想:一对多的依赖,自动通知!
- 被观察者(Subject):事件源头(如:服务器状态)
- 观察者(Observer):关心事件的人(如:运维、日志、告警)
- 订阅机制 :观察者主动注册,被观察者变化时自动广播
🧪 场景演示:服务器温度监控系统
Step 1:定义"被观察者"接口(Subject)
java
import java.util.*;
public interface ServerSubject {
void registerObserver(ServerObserver o);
void removeObserver(ServerObserver o);
void notifyObservers(); // 通知所有观察者
}
Step 2:定义"观察者"接口(Observer)
java
public interface ServerObserver {
void update(float temperature); // 接收通知
}
Step 3:实现被观察者 ------ 温度传感器
java
public class TemperatureSensor implements ServerSubject {
private List<ServerObserver> observers = new ArrayList<>();
private float currentTemp;
public void setCurrentTemp(float temp) {
this.currentTemp = temp;
notifyObservers(); // 温度一变,立刻广播!
}
@Override
public void registerObserver(ServerObserver o) {
observers.add(o);
}
@Override
public void notifyObservers() {
for (ServerObserver o : observers) {
o.update(currentTemp);
}
}
// ... removeObserver 略
}
Step 4:实现观察者们!
java
// 运维小哥
public class DevOpsGuy implements ServerObserver {
public void update(float temp) {
if (temp > 80) {
System.out.println("🔥 运维小哥警报:服务器快烧了!温度:" + temp + "℃");
}
}
}
// 日志系统
public class Logger implements ServerObserver {
public void update(float temp) {
System.out.println("📝 日志记录:当前温度 " + temp + "℃");
}
}
// 告警机器人
public class AlertBot implements ServerObserver {
public void update(float temp) {
if (temp > 90) {
System.out.println("🤖 告警机器人:启动紧急冷却!温度爆表:" + temp + "℃");
}
}
}
Step 5:启动"消息广播网"!
java
public class Main {
public static void main(String[] args) {
TemperatureSensor sensor = new TemperatureSensor();
// 所有人都来订阅!
sensor.registerObserver(new DevOpsGuy());
sensor.registerObserver(new Logger());
sensor.registerObserver(new AlertBot());
// 模拟温度变化
sensor.setCurrentTemp(75); // 日志记录
sensor.setCurrentTemp(85); // 运维小哥警报
sensor.setCurrentTemp(95); // 机器人启动冷却!
}
}
✅ 输出:
📝 日志记录:当前温度 75℃
🔥 运维小哥警报:服务器快烧了!温度:85℃
📝 日志记录:当前温度 85℃
🤖 告警机器人:启动紧急冷却!温度爆表:95℃
📝 日志记录:当前温度 95℃
🦸♀️ Watcher女侠的超能力解析
| 能力 | 对应设计原则 |
|---|---|
| 动态订阅/退订 | 解耦:被观察者不知道具体观察者是谁 |
| 自动广播 | 推模型(Push):主动推送数据 |
| 一对多通知 | 支持任意数量观察者,轻松扩展 |
💡 甚至支持 拉模型(Pull):只通知"有变化",观察者自己去拿数据!
🌐 现实中的"Watcher女侠"
- GUI事件监听:按钮点击 → 触发多个回调
- MQ消息队列:生产者发消息,多个消费者订阅
- Spring事件机制 :
ApplicationEvent+@EventListener - 前端框架:Vue/React 的响应式数据(数据变 → 视图自动更新)
⚠️ 注意事项
- 避免内存泄漏 :观察者用完记得
removeObserver()!
(否则对象无法被GC,就像"僵尸订阅者") - 通知顺序不可控:不要依赖观察者执行顺序!
- 线程安全 :多线程环境下,需加锁或使用
CopyOnWriteArrayList
🎯 总结:Watcher女侠的三大信条
- 松耦合:我不认识你,但我知道你在听。
- 自动同步:状态一变,全员知晓。
- 动态扩展:想加入?订阅即可!想退出?退订就行!
🚀 下一期预告:策略模式 ------ Strategy指挥官与"战术切换系统"!
面对不同敌人:
- 遇到高并发?启动"缓存战术"!
- 遇到数据不一致?切换"TCC补偿战术"!
- 遇到性能瓶颈?激活"异步削峰战术"!
Strategy指挥官说:
"不要写满 if-else 的战术手册!用策略模式,动态切换算法,像换武器一样简单!"