十九、观察者模式

  • 目的 : 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 核心 :主题(Subject/Observable)维护观察者列表,提供注册、注销和通知方法。观察者(Observer)实现更新接口。主题状态改变时,调用所有注册观察者的更新方法。
  • 场景 :常用于实现事件处理系统,如GUI组件的事件监听、股票价格变动通知等,当状态改变时自动通知所有订阅者。

首先是观察者接口,定义更新方法

java 复制代码
package observer;

public interface IWatcher {
	void update();
}

与一个具体观察类

java 复制代码
package observer;

public class UpdateWatcher implements IWatcher{

	@Override
	public void update() { // 当被观察对象发生变化时,此方法会被调用
		System.out.println(this + " 观察到目标已经更新了。");
	}
}

然后有一个被观察者接口(也称主题接口 Subject)

java 复制代码
package observer;

public interface IWathedSubject {

	void add(IWatcher watcher); 	// 添加观察者

	void remove(IWatcher watcher);	// 移除观察者

	void update();					// 更新主题状态

	void notifyWatchers();			// 通知所有观察者

}

与具体被观察者类

java 复制代码
package observer;

import java.util.ArrayList;
import java.util.List;

public class UpdateWatchedSubject implements IWathedSubject {
	private List<IWatcher> list;		// 存储观察者列表

	public UpdateWatchedSubject() {
		this.list = new ArrayList<>();	// 初始化观察者列表
	}

	@Override
	public void add(IWatcher watcher) {	// 添加新的观察者
		this.list.add(watcher);	
	}

	@Override
	public void remove(IWatcher watcher) { // 移除指定的观察者
		this.list.remove(watcher);
	}

	@Override
	public void update() {		// 主题状态发生变化时调用
		System.out.println("目标主题状态已更新..."); // 职责分离 状态变更的预处理
		notifyWatchers();						// 纯粹执行观察者通知
	}

	@Override
	public void notifyWatchers() {			// 纯粹执行 通知观察者
		for(IWatcher watcher : list){		// 遍历观察者列表
			watcher.update();				// 调用每个观察者的反应方法
		}
	}
}

最后是函数入口

java 复制代码
package observer;

public class MainTest {
	public static void main(String[] args) {

		//自定义观察者模式
		IWathedSubject watched = new UpdateWatchedSubject();		//创建主题
		watched.add(new UpdateWatcher());							//创建三个观察者
		watched.add(new UpdateWatcher());
		watched.add(new UpdateWatcher());
		watched.update();								//主题状态变化 通知每个观察者
		System.out.println();
	}
}

终端输出

复制代码
目标主题状态已更新...
observer.observer.UpdateWatcher@4aa298b7 观察到目标已经更新了。
observer.observer.UpdateWatcher@7d4991ad 观察到目标已经更新了。
observer.observer.UpdateWatcher@28d93b30 观察到目标已经更新了。
相关推荐
Cc.Y1 小时前
Java零基础入门:字符串深度掌握——从基础API到StringBuilder性能优化
java·开发语言·性能优化
shuoshuohaohao6 小时前
MyBatis 小知识点
java·spring·mybatis
海上小飞龙6 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
谢亮_vipxieliang7 小时前
泛型擦除、通配符与 PECS 一次讲透
java·面试
八解毒剂7 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
打工仔折腾 AI8 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战
ZealSinger8 小时前
Java虚拟线程上线后瓶颈转移到哪看三层
java·开发语言·firefox
2601_961133288 小时前
盘立方软件指标文华期货公式下载
java
蜗牛互联网8 小时前
长任务多Agent共享文件系统的Manifest交接模式
java·人工智能·后端
Sirens.8 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法