### 观察者模式详解及应用 #### 一、观察者模式概述 观察者模式是一种常用的软件设计模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,会通知所有的观察者对象,使其能够自动更新自己。这种模式适用于实现事件处理系统。 #### 二、观察者模式的基本组成部分 观察者模式主要由四个部分组成: 1. **抽象主题角色**: - 定义:将所有对观察者对象的引用保存在一个集合中。 - 功能:提供接口,允许增加和删除观察者角色。 - 实现方式:一般通过一个抽象类或接口来实现。 2. **抽象观察者角色**: - 定义:为所有具体的观察者定义一个接口。 - 功能:在得到主题的通知时更新自己的状态。 3. **具体主题角色**: - 定义:实现了抽象主题的角色。 - 功能:当内部状态改变时,给所有登记过的观察者发出通知。 - 实现方式:通常使用一个子类来实现。 4. **具体观察者角色**: - 定义:实现了抽象观察者角色的更新接口。 - 功能:使自身状态与主题的状态保持一致。 - 实现方式:通常通过一个子类来实现。 #### 三、观察者模式的核心概念解析 1. **抽象主题**(`AbstractWatched`):定义了添加和删除观察者的接口,并提供状态改变后的通知机制。 ```java public interface AbstractWatched { public void addWatcher(AbstractWatcher abstractWatcher); public void removeWatcher(AbstractWatcher abstractWatcher); public void removeAll(); public void changeStatus(); } ``` 2. **具体主题**(`ConcreteWatched`):实现了抽象主题的行为,维护了一个观察者列表,并在其状态改变时通知这些观察者。 ```java public class ConcreteWatched implements AbstractWatched { List<AbstractWatcher> watchers = new ArrayList<AbstractWatcher>(); public void addWatcher(AbstractWatcher abstractWatcher) { watchers.add(abstractWatcher); } public void changeStatus() { System.out.println("status has changed"); for (AbstractWatcher watcher : watchers) { watcher.update(); } } public void removeAll() { watchers.clear(); } public void removeWatcher(AbstractWatcher abstractWatcher) { watchers.remove(abstractWatcher); } } ``` 3. **抽象观察者**(`AbstractWatcher`):定义了更新行为的接口。 ```java public interface AbstractWatcher { public void update(); } ``` 4. **具体观察者**(`ConcreteWatcher`):实现了抽象观察者的更新接口,当接收到主题状态的变化通知后执行具体的更新逻辑。 ```java public class ConcreteWatcher implements AbstractWatcher { public void update() { System.out.println("update"); } } ``` #### 四、示例代码分析 下面是一段简单的Java代码示例,展示了如何使用上述定义的接口和类来实现观察者模式。 ```java public class Client { public static void main(String[] args) { AbstractWatched watched = new ConcreteWatched(); AbstractWatcher watcher1 = new ConcreteWatcher(); AbstractWatcher watcher2 = new ConcreteWatcher(); AbstractWatcher watcher3 = new ConcreteWatcher(); watched.addWatcher(watcher1); watched.addWatcher(watcher2); watched.addWatcher(watcher3); watched.changeStatus(); // 所有的观察者都会收到通知并执行 update 方法 System.out.println("----------------------"); watched.removeWatcher(watcher3); // 移除一个观察者 watched.changeStatus(); // 只有两个观察者会收到通知 System.out.println("----------------------"); watched.removeAll(); // 移除所有观察者 watched.changeStatus(); // 没有观察者会收到通知 } } ``` #### 五、总结 观察者模式是一种非常实用的设计模式,它可以帮助我们构建响应式和事件驱动的应用程序。通过定义明确的接口和角色,我们可以轻松地扩展系统的功能,同时也使得各个组件之间的耦合度更低,更易于维护。此外,观察者模式还提供了一种灵活的方式来管理对象之间的交互,使得应用程序更加模块化和可复用。


















- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- (源码)基于Python和Neo4j的智能就医系统.zip
- 监控专用网络EPON系统测试方案.doc
- Comsol与Matlab联合仿真及模型参数优化:以燃料电池流道优化为例
- 基于JAVA的餐饮管理系统毕业论文1.doc
- (源码)基于Arduino的生物机械手控制系统.zip
- 基于DSP的电机控制技术研究:无刷直流伺服电机的数学模型与控制策略实现
- COMSOL热-流-固三场耦合模拟煤层气藏注CO2开发及CCUS应用 - COMSOL 教程
- (源码)基于ROS的机器人感知与控制项目.zip
- 基于C#与西门子PLC的工控数据采集系统实战源码及精美UI ScottPlot 全面版
- (源码)基于Arduino UNO和TensorFlowKeras的MNIST手写数字快速分类系统.zip
- 三相PWM整流电路的双闭环控制与Simulink仿真实现及应用 - PWM调制
- (源码)基于Python和LightGBM的视频留存预测系统.zip
- 基于Carsim2020.0与Matlab Simulink2018b的7自由度车辆动力学模型联合仿真验证
- MATLAB Simulink中线性分组码BCH与卷积码的工程实现及误码率分析
- (源码)基于嵌入式C语言的LED矩阵贪吃蛇游戏.zip
- MATLAB频散曲线绘制软件:圆柱、圆环导波问题求解工具 - GUI界面


