十九、观察者模式

  • 目的 : 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 核心 :主题(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 观察到目标已经更新了。
相关推荐
唐青枫20 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261351 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜2 天前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫2 天前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq2 天前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev2 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮2 天前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js