恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象间的一对多依赖关系
首页
资讯中心
/
观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象间的一对多依赖关系
观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象间的一对多依赖关系
发布时间:2026/8/5 11:38:41
观察者模式Observer Pattern是一种行为型设计模式用于定义对象间的一对多依赖关系当一个对象称为“被观察者”或“Subject”的状态发生改变时所有依赖于它的对象称为“观察者”或“Observers”都会自动收到通知并更新。该模式解耦了被观察者与观察者支持动态添加/移除观察者广泛应用于事件驱动系统、GUI框架如Java Swing、Android LiveData、消息总线、发布-订阅系统等场景。典型结构包括Subject被观察者维护观察者列表提供注册attach、注销detach和通知notify方法Observer观察者定义更新接口如update()由具体观察者实现具体被观察者ConcreteSubject与具体观察者ConcreteObserver实现各自逻辑。优点松耦合、可扩展性强、支持广播通信缺点可能引发内存泄漏若未及时注销、通知顺序不可控、缺乏回调反馈机制观察者无法向被观察者返回结果。fromabcimportABC,abstractmethodfromtypingimportList,AnyclassObserver(ABC):abstractmethoddefupdate(self,data:Any)-None:passclassSubject(ABC):def__init__(self):self._observers:List[Observer][]defattach(self,observer:Observer)-None:ifobservernotinself._observers:self._observers.append(observer)defdetach(self,observer:Observer)-None:ifobserverinself._observers:self._observers.remove(observer)defnotify(self,data:Any)-None:forobserverinself._observers:observer.update(data)# 示例天气站通知订阅者classWeatherStation(Subject):defset_temperature(self,temp:float)-None:print(f天气站更新温度{temp}°C)self.notify(temp)classPhoneDisplay(Observer):defupdate(self,data:float)-None:print(f[手机端] 收到温度更新{data}°C)classWebDisplay(Observer):defupdate(self,data:float)-None:print(f[网页端] 收到温度更新{data}°C)# 使用示例stationWeatherStation()phonePhoneDisplay()webWebDisplay()station.attach(phone)station.attach(web)station.set_temperature(25.6)# 输出两条通知观察者模式Observer与发布-订阅模式Pub/Sub本质目标相似解耦通知方与接收方但核心区别在于通信耦合度与中介角色的存在与否因此不属于严格意义上的同一类模式而是演进关系Pub/Sub 可视为观察者模式的松耦合变体或扩展。✅核心区别对比维度观察者模式Observer发布-订阅模式Pub/Sub耦合方式被观察者Subject直接持有并调用观察者Observer引用 →存在直接引用耦合发布者Publisher与订阅者Subscriber均不互相持有引用全部通过中间消息代理Event Bus / Message Broker通信 →完全解耦注册机制观察者主动向被观察者注册subject.attach(observer)订阅者向事件总线注册感兴趣的主题topic发布者也只面向总线发布不感知谁订阅消息传递通知是同步、即时的方法调用observer.update()通常支持异步、缓冲、持久化、过滤、广播/单播等高级语义消息可被暂存、重放、路由生命周期管理被观察者需显式管理观察者列表增删易引发内存泄漏如未detach总线统一管理订阅关系更易实现自动清理如基于弱引用、超时注销典型实现Javajava.util.Observable已弃用、.NETIObservableT、前端EventTarget.addEventListenerRedis Pub/Sub、RabbitMQ、Vue 3 的mitt、RxJS 的Subject增强版、Node.js 的events.EventEmitter轻量级近似关键洞察观察者模式是对象层级的、同步的、内存内的通知机制Pub/Sub 是系统/服务层级的、常为异步的、可能跨进程/网络的消息范式引入了中介Broker作为第一公民。→ 因此Pub/Sub 是观察者模式在分布式、高内聚低耦合需求下的抽象升级而非简单等价替换。# 简化对比示例同一事件“用户登录成功”# ✅ Observer紧耦合user_service.attach(login_logger)# user_service 直接知道 login_loggeruser_service.attach(email_notifier)user_service.notify_login(user)# 同步调用两个对象方法# ✅ Pub/Sub松耦合event_bus.publish(user.login,{user_id:123})# user_service 不知谁监听# login_logger 和 email_notifier 各自向 event_bus 订阅 user.login# event_bus 负责分发二者互不可见