Java观察者模式详解:实例演示与UML图
123 浏览量
更新于2024-08-31
收藏 100KB PDF 举报
Java中的观察者模式是一种行为设计模式,用于处理对象之间的一对多依赖关系,当一个对象(被观察者)的状态发生改变时,与其关联的多个对象(观察者)会自动接收到通知并更新自身状态。在Java中,这种模式通常通过`java.util.Observable`和`java.util.Observer`接口来实现,尽管这些接口的使用并不广泛,因为它们的灵活性有限,不便于扩展。
观察者模式的核心要素包括:
1. Subject(被观察者):维护一组观察者列表,并提供注册和注销观察者的方法。当Subject状态改变时,调用`notifyObservers()`方法通知所有已注册的观察者。
2. Observer(观察者):定义一个接收通知的接口,通常包含`update()`方法,该方法会在接收到Subject的通知时被调用,处理更新内容。
3. 注册与解绑:Subject允许观察者注册和取消注册,以动态管理观察者集合。这通常通过实现`addObserver()`和`removeObserver()`方法来完成。
4. 通知机制:Subject内部有一个通知机制,例如通过数组或集合来存储观察者,当状态改变时遍历列表,调用每个观察者的`update()`方法。
在实际应用中,观察者模式被广泛应用于各种场景,如Java Messages Service (JMS)中的消息发布和订阅机制,以及MVC(模型-视图-控制器)架构中,模型作为被观察者,视图作为观察者,视图会订阅模型的变化,实时更新显示。
下面是一个简单的Java观察者模式实例,展示了如何创建一个`Subject`接口和实现它的类,以及一个`Observer`接口和实现它的类:
```java
package com.journaldev.design.observer;
public interface Subject {
// 注册观察者
void addObserver(Observer observer);
// 解除观察者
void removeObserver(Observer observer);
// 更新所有观察者
void notifyObservers();
}
// 观察者接口
public interface Observer {
// 当Subject状态变化时,接收更新
void update(String message);
}
// Subject实现
public class SimpleSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer o : observers) {
o.update("主题内容更新");
}
}
}
// 观察者实现
public class SimpleObserver implements Observer {
@Override
public void update(String message) {
System.out.println("观察者接收到消息: " + message);
}
}
```
在这个例子中,`SimpleSubject`类充当被观察者,它维护一个观察者列表,并在状态改变时调用`notifyObservers()`方法。`SimpleObserver`类是观察者,当接收到通知时,它会打印出接收到的消息。
通过这种方式,Java中的观察者模式提供了一种灵活、可扩展的方式来管理对象之间的依赖关系,使得系统可以保持松耦合,易于维护和扩展。
2009-06-30 上传
2009-05-24 上传
2020-08-19 上传
2012-02-20 上传
2011-12-08 上传
2018-03-09 上传
2010-04-18 上传
2009-03-22 上传
2012-05-01 上传
weixin_38672800
- 粉丝: 4
- 资源: 917
最新资源
- Haskell编写的C-Minus编译器针对TM架构实现
- 水电模拟工具HydroElectric开发使用Matlab
- Vue与antd结合的后台管理系统分模块打包技术解析
- 微信小游戏开发新框架:SFramework_LayaAir
- AFO算法与GA/PSO在多式联运路径优化中的应用研究
- MapleLeaflet:Ruby中构建Leaflet.js地图的简易工具
- FontForge安装包下载指南
- 个人博客系统开发:设计、安全与管理功能解析
- SmartWiki-AmazeUI风格:自定义Markdown Wiki系统
- USB虚拟串口驱动助力刻字机高效运行
- 加拿大早期种子投资通用条款清单详解
- SSM与Layui结合的汽车租赁系统
- 探索混沌与精英引导结合的鲸鱼优化算法
- Scala教程详解:代码实例与实践操作指南
- Rails 4.0+ 资产管道集成 Handlebars.js 实例解析
- Python实现Spark计算矩阵向量的余弦相似度