温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java观察者模式通知顺序怎样

发布时间:2026-09-13 07:57:46 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

在 Java 观察者模式(Observer Pattern) 中,通知顺序主要取决于你使用的实现方式。下面分情况说明:


一、自己实现的观察者模式(最常见)

如果你是这样写的:

interface Observer {
    void update(String msg);
}

class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer o) {
        observers.add(o);
    }

    public void notifyObservers(String msg) {
        for (Observer o : observers) {
            o.update(msg);
        }
    }
}

✅ 通知顺序特点

  • 按添加顺序(注册顺序)通知
  • 使用的是 List(如 ArrayList)
  • 先 addObserver 的先被通知

示例

subject.addObserver(A);
subject.addObserver(B);
subject.addObserver(C);

通知顺序:

A → B → C

⚠️ 注意:

  • 如果你用 Set(如 HashSet),顺序不确定
  • 如果在通知过程中动态增删观察者,要特别小心(可能漏通知或重复通知)

二、Java 自带的 java.util.Observable(已废弃)

class Subject extends Observable {
    public void change() {
        setChanged();
        notifyObservers("hello");
    }
}

通知顺序

  • 也是按添加顺序
  • 底层使用 Vector
  • 线程安全,但性能差

⚠️ Observable 在 Java 9 已被标记为 ** deprecated**


三、Spring 中的观察者(ApplicationEvent)

@EventListener
public void onEvent(MyEvent e) {}

通知顺序

  • 默认不保证顺序
  • 可用 @Order 或实现 Ordered 接口指定
@Order(1)
@EventListener
public void a() {}

@Order(2)
@EventListener
public void b() {}

顺序:

a → b

四、总结对照表

实现方式 通知顺序 是否可控
自定义 List 添加顺序 ✅ 可控制
HashSet 不确定 ❌
Observable 添加顺序 ❌
Spring Event 默认无序 ✅ @Order

五、最佳实践建议

  1. 不要依赖观察者的执行顺序做业务逻辑
  2. 如果必须顺序执行,考虑:
    • 使用 @Order
    • 或改为责任链模式
  3. 观察者方法应保持:
    • 无返回值
    • 不抛异常
    • 执行时间短

如果你有具体代码或框架(如 Spring / JavaFX / 自定义),我可以帮你精确分析通知顺序。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手