十九、观察者模式

  • 目的 : 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 核心 :主题(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 观察到目标已经更新了。
相关推荐
帅次7 分钟前
Android 17 开发者实战:核心更新与应用场景落地指南
android·java·ios·android studio·iphone·android jetpack·webview
Ramble_Naylor13 分钟前
东方通(TongWeb)SpringBoot开发指导
java·spring boot
大鹏说大话19 分钟前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
云烟成雨TD25 分钟前
Spring AI Alibaba 1.x 系列【64】 ReactAgent 长期记忆
java·人工智能·spring
quan263137 分钟前
20260529,日常开发-数据库主从问题
java·mysql·主从·延迟
JacksonMx1 小时前
@Transactional 最佳实践
java·spring boot·spring·性能优化
Sincerelyplz1 小时前
【AI会议纪要实践】mapReduce、RAG 与结构化输出
java·后端·agent
过期动态1 小时前
【LeetCode 热题 100】接雨水
java·数据结构·算法·leetcode·职场和发展
zhangjw342 小时前
第15篇:Java多线程零基础入门,进程线程、线程创建方式、线程生命周期、线程安全彻底吃透
java·开发语言·面试
蝈理塘(/_\)大怨种2 小时前
类和对象 (上)
java·开发语言