经典Observer模式实现:推拉模式解析

5星 · 超过95%的资源 需积分: 9 2 下载量 31 浏览量 更新于2024-07-31 收藏 103KB DOCX 举报
"重温Observer模式--热水器·改" Observer模式,也称为订阅-发布模式,是设计模式中的一种行为模式,其主要目的是定义对象之间的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C#中,通常使用委托和事件来实现Observer模式,但其实还有其他方式,如GOF(GoF,Gang of Four)的经典实现。 Observer模式的主要角色包括Subject(主题)和Observer(观察者)。Subject是被观察的对象,它通常包含了一些关键状态或数据,而Observer则是对这些状态感兴趣的实体,当Subject的状态发生变化时,Observer会收到通知并做出相应反应。 在经典实现中,Subject通常提供以下方法: 1. Register(Observer): 允许Observer注册到Subject,表示Observer对Subject的状态变化感兴趣。 2. UnRegister(Observer): 允许Observer取消注册,不再关注Subject的状态变化。 3. Notify(): 当Subject的状态发生变化时,调用此方法通知所有注册的Observer。 Observer接口通常包含一个Update()方法,这是Subject在通知Observer时调用的方法,以便Observer能根据新的状态更新自己的行为。 在具体实现时,Subject内部会维护一个Observer对象的集合,如List<Observer>,注册Observer时将其添加到集合中,取消注册时移除。Notify()方法会遍历这个集合,对每个Observer调用其Update()方法。 在上述热水器的例子中,Subject是热水器,Observer可能是温度显示器或其他关心热水器状态的组件。热水器有一个BoilWater()方法,代表开始烧水的动作,而烧水过程中温度达到特定值时,热水器会触发一个状态变化(即温度变化),此时,热水器会调用私有的Notify()方法,通知所有注册的Observer(如温度显示器)更新显示。 推模式(Push)和拉模式(Pull)是Observer模式中两种不同的通知策略: - 推模式:Subject主动将状态变化的信息推送给Observer。就像热水器例子中,热水器温度变化时,热水器主动通知Observer更新状态。 - 拉模式:Observer主动从Subject获取最新的状态。Observer需要时会向Subject请求最新的状态信息,而不是等待Subject的通知。 这两种模式各有优缺点,推模式简化了Subject的实现,但可能造成不必要的通知,而拉模式更加灵活,但可能增加Observer的复杂性。选择哪种模式取决于具体的应用场景和需求。 Observer模式提供了一种灵活的机制,使对象间的耦合度降低,使得系统能够更有效地处理状态变化和事件驱动,广泛应用于各种软件系统中,如UI更新、实时数据监控等场景。