温馨提示×

温馨提示×

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

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

怎样理解java observer模式

发布时间:2026-10-24 13:42:28 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

Java 中的 Observer(观察者)模式 是一种行为型设计模式,核心思想是:

一个对象状态发生变化时,自动通知所有依赖它的对象,使它们能够做出相应更新。


一、生活化理解

可以把 Observer 模式想象成:

  • 微信公众号(被观察者 / Subject)
  • 关注公众号的用户(观察者 / Observer)

当公众号发布新文章(状态变化),所有用户都会收到推送(自动通知)。


二、核心角色

在 Java 中,Observer 模式通常包含:

1️⃣ Subject(被观察者 / 主题)

  • 维护观察者列表
  • 提供注册 / 移除观察者的方法
  • 状态变化时通知观察者

2️⃣ Observer(观察者)

  • 定义一个更新接口
  • 被通知时执行相应逻辑

三、Java 原生支持(早期 API)

Java 本身就提供了接口:

import java.util.Observable;
import java.util.Observer;

示例

被观察者

class NewsPublisher extends Observable {
    public void publish(String news) {
        setChanged();           // 标记状态改变
        notifyObservers(news); // 通知观察者
    }
}

观察者

class User implements Observer {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println(name + " 收到新闻: " + arg);
    }
}

使用

NewsPublisher publisher = new NewsPublisher();
publisher.addObserver(new User("张三"));
publisher.addObserver(new User("李四"));

publisher.publish("Java 21 发布了!");

⚠️ 注意:Observable 和 Observer 已在 Java 9 被标记为过时(deprecated),不推荐新项目使用。


四、推荐使用方式(自定义实现)

更常见、更灵活的做法是自己定义接口:

// 观察者接口
interface Observer {
    void update(String message);
}

// 被观察者
class Subject {
    private List<Observer> observers = new ArrayList<>();

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

    public void removeObserver(Observer o) {
        observers.remove(o);
    }

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

五、Observer 模式的优点

✅ 解耦(被观察者不依赖具体观察者)
✅ 符合“开闭原则”
✅ 支持一对多通知


六、Observer 模式的缺点

❌ 通知链过长时性能下降
❌ 容易造成循环通知
❌ 观察者过多时难以调试


七、实际应用举例

  • GUI 事件监听(按钮点击)
  • Spring 的 ApplicationEvent
  • MQ / 消息推送
  • 响应式编程(RxJava、Reactor)

八、一句话总结

Observer 模式就是:你变了我知道,而且不用你主动来找我。

如果你愿意,我也可以用 UML 图 或 结合 Spring 事件机制 再帮你深入讲一层。

向AI问一下细节

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

AI
助
手