十九、观察者模式

  • 目的 : 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 核心 :主题(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 观察到目标已经更新了。
相关推荐
小碗羊肉2 小时前
【从零开始学Java | 第三十八篇】序列化流(Object Stream)
java·开发语言
亚历克斯神2 小时前
Java 23 虚拟线程进阶:深度探索与实战
java·spring·微服务
想带你从多云到转晴2 小时前
02、JAVAEE--多线程(二)
java·开发语言·javaee
AIoT科技物语2 小时前
免费开源!50+算法,Java基于YOLO框架的视频AI识别算法平台,适配低空无人机巡检、摄像头安防场景
java·人工智能·算法·yolo·开源
黑客大白2 小时前
IDEA安装教程配置java环境(超详细)_idea配置java,零基础入门到精通,收藏这篇就够了
java·ide·intellij-idea
一只大袋鼠2 小时前
Java JDBC 封装:从原生写法到工具类封装 + 增删改查
java·开发语言·数据库·mysql
ch.ju2 小时前
Java程序设计(第3版)第二章——三元运算符
java
txxzjmzlh2 小时前
Java 线程的几种状态
java·开发语言
椰羊~王小美2 小时前
主流编程语言及工具的典型应用场景总结
java