java iterator 遍历观察者模式的核心做法是:在 subject(被观察者)内部维护一个 listregister()、unregister() 和 notifyobservers() 方法。在 notifyobservers() 中,使用 iterator 遍历该列表并调用每个 observer 的更新方法。这样做可以安全地处理集合变更,避免 concurrentmodificationexception。

Subject 如何管理 Observer 列表
Subject 类需要持有 Observer 对象的引用集合。通常使用 ArrayList 或 CopyOnWriteArrayList。关键在于提供注册和注销的方法,以便在状态变化前能准确获取所有订阅者。

import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
public void register(Observer o) {
if (!observers.contains(o)) {
observers.add(o);
}
}
public void unregister(Observer o) {
observers.remove(o);
}
public void setState(String state) {
this.state = state;
notifyObservers();
}
public String getState() {
return state;
}
}
Iterator 在通知过程中的作用
在 notifyObservers() 中,直接增强 for 循环(foreach)可能会因为 Observer 在更新过程中修改了 Subject 的列表而抛出异常。使用显式 Iterator 可以在遍历时安全地移除元素,或者通过捕获异常来处理并发修改问题。更稳健的做法是使用快照或 CopyOnWrite 机制,但 Iterator 提供了基础的遍历控制能力。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;

@Override
public void notifyObservers() {
// 使用 Iterator 遍历以避免 ConcurrentModificationException
Iterator<Observer> it = observers.iterator();
while (it.hasNext()) {
Observer observer = it.next();
try {
observer.update(this);
} catch (Exception e) {
// 处理单个 Observer 的异常,不影响其他 Observer
System.err.println("Observer update failed: " + e.getMessage());
}
}
}
Observer 更新时移除自身会发生什么
如果某个 Observer 在 update() 方法中调用 subject.unregister(this),使用普通 Iterator 会抛出 ConcurrentModificationException。正确的做法是在迭代器上调用 it.remove(),但这要求 Observer 知道它正在被遍历。在实际开发中,建议将移除操作推迟到通知结束后执行,或使用线程安全的集合类。

















