观察者模式java

观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系。在该模式中,一个主题(被观察者)维护了一个观察者列表,并在自身状态发生变化时通知所有观察者进行相应的更新。

观察者模式的核心概念包括以下几个角色:

主题(Subject):也称为被观察者或发布者,它维护了一个观察者列表,并提供方法用于注册、注销和通知观察者。

观察者(Observer):也称为订阅者或监听器,它定义了一个接口或抽象类,包含了观察者所需实现的方法,通常包括更新方法,在主题状态改变时被调用。

具体主题(Concrete Subject):实现主题接口或抽象类,具体主题维护自身状态,并在状态变化时通知观察者。

具体观察者(Concrete Observer):实现观察者接口或抽象类的具体类,它负责接收主题的通知并执行相应的操作。

观察者模式是一种行为型设计模式,用于在对象之间建立一对多的依赖关系,当一个对象的状态发生变化时,其所有依赖对象都会自动收到通知并进行相应的更新。观察者模式具有以下优势和适用场景:

优势:

解耦:观察者模式将被观察者和观察者解耦,使它们可以独立地进行扩展和修改,而不会影响到彼此。

松散耦合:被观察者只需要知道观察者接口而不需要了解具体观察者的实现,从而降低了彼此之间的依赖程度,实现了松散耦合。

可重用性:观察者模式可增加新的观察者或被观察者,无需修改原有代码,提高了代码的可重用性。

使用场景:

当一个对象的改变需要同时通知其他多个对象,并且这些对象的更新操作可能不同步时,可以使用观察者模式。

当一个对象的状态变化需要引起其他相关对象的状态变化时,可以使用观察者模式来保持对象之间的一致性。

当系统中存在一个主体对象和多个观察者对象之间的动态关系,并且希望避免对象之间的紧耦合关系时,可以使用观察者模式。

当一个对象需要将自己的状态变化通知给一组观察者,同时这些观察者对象具有不同的行为和角色时,可以使用观察者模式。

总结来说,观察者模式适用于多个对象之间存在一对多的依赖关系,当一个对象的状态变化需要通知其他对象并进行相应处理时,观察者模式能够提供一种松散耦合的解决方案,增加系统的灵活性和可扩展性。

1、观察者模式是一种一对多的依赖关系,让多个观察者同时监听某一主题对象。当这个主题对象发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

2、JAVA提供的对观察者模式的支持

在JAVA语言的java.util库里面,提供了一个Observable类以及一个Observer接口,构成JAVA语言对观察者模式的支持。

(1)Observer接口

这个接口只定义了一个方法,即update()方法,当被观察者对象的状态发生变化时,被观察者对象的notifyObservers()方法就会调用这一方法。

public interface Observer {

void update(Observable o, Object arg);

}

(2)Observable类

被观察者类都是java.util.Observable类的子类。java.util.Observable提供公开的方法支持观察者对象,这些方法中有两个对Observable的子类非常重要:一个是setChanged(),另一个是notifyObservers()。第一方法setChanged()被调用之后会设置一个内部标记变量,代表被观察者对象的状态发生了变化。第二个是notifyObservers(),这个方法被调用时,会调用所有登记过的观察者对象的update()方法,使这些观察者对象可以更新自己。

相关推荐
二哈赛车手4 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
为何创造硅基生物5 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好5 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~5 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
星寂樱易李5 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
YDS8295 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆6 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
未若君雅裁6 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
cen__y7 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git