C. 观察者模式 ✅(一对多状态通知)
理由:在智能家居系统中,温度传感器作为被观察对象(Subject),当其检测到温度变化时,需自动通知多个依赖设备(如空调、加湿器、风扇、报警器等)进行响应。观察者模式正适用于这种“一对多”的松耦合事件通知机制——传感器无需知道具体有哪些设备,只需发布状态变更;各设备(观察者)自行注册并实现更新逻辑,实现解耦、可扩展和实时响应。
其他选项分析:
- A. 策略模式:用于封装可互换的算法(如不同温控策略),不解决“状态变化通知”问题;
- B. 工厂模式:用于对象创建,与运行时动态响应无关;
- D. 单例模式:仅保证全局唯一实例,无法处理多组件间的联动通知。
# 观察者模式简例(Python)
from abc import ABC, abstractmethod
class Observer(ABC):
@abstractmethod
def update(self, temperature: float): pass
class AirConditioner(Observer):
def update(self, temperature: float):
if temperature > 28: print("空调启动制冷")
class Humidifier(Observer):
def update(self, temperature: float):
if temperature < 40: print("加湿器启动加湿")
class TemperatureSensor:
def __init__(self):
self._observers = []
self._temp = None
def attach(self, observer: Observer):
self._observers.append(observer)
def set_temperature(self, temp: float):
self._temp = temp
for obs in self._observers:
obs.update(temp)
# 使用示例
sensor = TemperatureSensor()
sensor.attach(AirConditioner())
sensor.attach(Humidifier())
sensor.set_temperature(30) # → 空调启动制冷;加湿器启动加湿(按逻辑条件触发)
观察者模式(Observer Pattern)与发布-订阅模式(Pub/Sub)在表层目标一致(解耦事件发布者与消费者),但核心架构与职责分离程度存在本质区别:
✅ 核心区别:
| 维度 | 观察者模式 | 发布-订阅模式 |
|---|---|---|
| 耦合方式 | Subject(被观察者)直接持有并调用 Observer 列表(内存内、同步调用) | Publisher 与 Subscriber 完全解耦,通过中间消息代理(Broker/Event Bus) 通信 |
| 依赖关系 | Observer 需主动向 Subject 注册(subject.attach(observer)),Subject 知道 Observer 存在 | Publisher 和 Subscriber 互不知晓对方,仅依赖 Broker 的主题(Topic)或事件类型 |
| 通信时机 | 通常同步执行(通知即调用),阻塞发布者流程 | 多为异步、可缓冲、可持久化(如消息队列),支持离线订阅、重试、广播/组播 |
| 实现粒度 | 面向对象层级,常用于单进程内模块间通信 | 架构层级,常跨进程、跨服务、跨网络(如 MQTT、RabbitMQ、Redis Pub/Sub) |
🔍 智能家居中是否可互换?
→ 不可简单互换,需按场景选型:
- ✅ 小规模本地系统(如树莓派+ESP32组成的家庭网关,所有设备在同一局域网/单机运行):观察者模式足够轻量、低延迟、易调试,适合快速原型开发;
- ✅ 规模化、高可靠、多终端场景(如接入云平台、手机App远程控制、第三方IoT设备接入、断网续传需求):必须使用发布-订阅模式——它天然支持设备动态上下线、网络分区容忍、事件回溯、权限隔离(如
home/livingroom/temperature主题)、以及与工业标准(MQTT/CoAP)无缝集成。
💡 补充说明:
许多现代框架(如 Python 的 blinker、JavaScript 的 EventEmitter)名义上叫“观察者”,实则已融合 Pub/Sub 特性(如基于字符串 topic 的注册);而 Spring Event 或 Android LiveData 虽称“观察者”,本质是进程内同步观察者。真正的 Pub/Sub 一定引入了中介者角色(Broker),这是区分二者最关键的“架构签名”。



被折叠的 条评论
为什么被折叠?



