Java设计模式漫画英雄宇宙-观察者模式 —— Watcher女侠与“消息广播网”!

在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 的响应式数据(数据变 → 视图自动更新)

⚠️ 注意事项

  1. 避免内存泄漏 :观察者用完记得 removeObserver()
    (否则对象无法被GC,就像"僵尸订阅者")
  2. 通知顺序不可控:不要依赖观察者执行顺序!
  3. 线程安全 :多线程环境下,需加锁或使用 CopyOnWriteArrayList

🎯 总结:Watcher女侠的三大信条

  1. 松耦合:我不认识你,但我知道你在听。
  2. 自动同步:状态一变,全员知晓。
  3. 动态扩展:想加入?订阅即可!想退出?退订就行!

🚀 下一期预告:策略模式 ------ Strategy指挥官与"战术切换系统"!

面对不同敌人:

  • 遇到高并发?启动"缓存战术"!
  • 遇到数据不一致?切换"TCC补偿战术"!
  • 遇到性能瓶颈?激活"异步削峰战术"!

Strategy指挥官说:

"不要写满 if-else 的战术手册!用策略模式,动态切换算法,像换武器一样简单!"

相关推荐
stormsha2 小时前
Java 设计模式探秘饿汉式与懒汉式单例模式的深度解析
java·单例模式·设计模式·java-ee
f***45322 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
口袋物联8 小时前
设计模式之单例模式在 C 语言中的应用(含 Linux 内核实例)
c语言·单例模式·设计模式
__万波__8 小时前
二十三种设计模式(一)--单例模式
java·单例模式·设计模式
雨中飘荡的记忆11 小时前
设计模式之组合模式
java·设计模式
Blossom.11811 小时前
基于Mamba-2的实时销量预测系统:如何用选择性状态空间干掉Transformer的O(n²)噩梦
人工智能·python·深度学习·react.js·机器学习·设计模式·transformer
一个处女座的暖男程序猿12 小时前
3大类设计模式
设计模式
双木的木12 小时前
Coggle数据科学 | 并行智能体:洞察复杂系统的 14 种并发设计模式
运维·人工智能·python·设计模式·chatgpt·自动化·音视频
执笔论英雄13 小时前
【RL】Slime异步原理(单例设计模式)3
设计模式