### 设计模式培训 - Observer 模式解析 #### 核心知识点:策略模式与Observer模式 **策略模式**的核心在于将一系列算法封装成独立的对象,这样可以在不改变客户端的情况下自由切换算法。这种模式有助于实现软件设计中的灵活性和可扩展性。 - **策略模式的核心组成部分**: - **算法使用者**:即需要根据不同情况使用不同算法的对象。 - **算法接口**:定义了一系列算法应具有的公共接口。 - **算法封装**:每个具体的算法都实现了算法接口,并提供了具体的实现逻辑。 - **策略模式的设计原则**: - **可变性封装原则**:将变化的行为封装起来,使其可以独立于稳定的上下文进行变化。 - **面向接口编程原则**:依赖于抽象接口而非具体实现,提高系统的灵活性。 - **组合/聚合复用原则**:通过组合或聚合的方式重用已有对象,避免通过继承方式导致的类层次过于复杂。 #### Observer模式详解 **Observer模式**是一种行为设计模式,它允许对象在状态发生改变时通知所有注册的监听者,从而使多个对象能够对事件做出响应。该模式通常用于实现事件驱动系统中的观察者列表。 - **背景**:本部分介绍了一个关于气象站的例子,其中涉及到多种天气数据(如温度、湿度、气压等),并需要根据这些数据的变化实时更新显示界面。这一需求促使我们采用一种更灵活的方式来管理这些变化,从而引入了Observer模式。 - **关键组件**: - **Subject**(主题):维护一个观察者列表,并提供注册、取消注册及通知观察者的接口。 - **Observer**(观察者):定义接收通知后要更新自身的接口。 - **Concrete Subject**(具体主题):实现Subject接口,持有观察者列表,并在状态发生变化时通知所有观察者。 - **Concrete Observer**(具体观察者):实现Observer接口,当收到通知时更新自己的状态。 - **案例分析**: - **WeatherData类**作为Concrete Subject,负责收集天气数据并通知所有注册的观察者。 - **测量值获取方法**:`getTemperature()`、`getHumidity()` 和 `getPressure()` 分别获取当前的温度、湿度和气压。 - **状态变更方法**:`measurementsChanged()` 在测量值更新时被调用。 - **观察者类**(如CurrentConditionsDisplay、StatisticsDisplay、ForecastDisplay等)作为Concrete Observer,负责根据接收到的数据更新显示。 - **问题分析**: - **首次实现的问题**: - **面向实现在编程**:直接在`WeatherData`类内部实现显示更新逻辑,违反了面向接口编程的原则。 - **缺乏灵活性**:每次添加新的显示功能都需要修改`WeatherData`类。 - **运行时不可扩展**:无法动态地添加或移除观察者。 - **通用接口缺失**:各个显示功能之间没有统一的接口。 - **封装不足**:容易变化的部分(如显示逻辑)没有很好地封装起来。 - **违反开闭原则**:每次增加新功能都需要修改现有代码,不符合“对扩展开放,对修改关闭”的原则。 - **解决方案**: - **引入Observer模式**:将`WeatherData`类改造为Subject的角色,通过注册和通知机制管理观察者。 - **定义Observer接口**:为所有观察者定义一个通用接口,确保它们能接收数据更新的通知。 - **实现具体的观察者**:每个具体的显示类实现Observer接口,并在接收到更新时调用相应的更新方法。 通过以上分析可以看出,Observer模式不仅解决了原有设计中的问题,还增强了系统的灵活性和可扩展性,使其能够在不修改现有代码的情况下轻松应对未来的功能扩展需求。
- 粉丝: 0
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助