温馨提示×

温馨提示×

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

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

java观察者模式与发布订阅区别

发布时间:2026-09-13 05:23:42 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

在 Java 中,观察者模式(Observer Pattern)和发布订阅模式(Publish–Subscribe Pattern)经常被拿来比较,因为它们思想相似,但耦合程度、结构和适用场景不同。下面从多个维度说明区别。


一、核心概念对比

1. 观察者模式(Observer)

  • 角色:
    • Subject(被观察者 / 目标)
    • Observer(观察者)
  • 关系:
    • 观察者直接注册到被观察者
    • 被观察者直接调用观察者的方法
  • 特点:
    • 松耦合但仍有直接依赖
    • 通常是同步调用
// 伪代码
subject.addObserver(observer);
subject.notifyObservers();

2. 发布订阅模式(Pub/Sub)

  • 角色:
    • Publisher(发布者)
    • Subscriber(订阅者)
    • 消息中心 / 事件总线(Broker)
  • 关系:
    • 发布者和订阅者互不知道对方存在
    • 通过**中间层(EventBus / MQ)**通信
  • 特点:
    • 完全解耦
    • 可异步、可跨进程、跨服务
Publisher → EventBus → Subscriber

二、主要区别总结表

对比点 观察者模式 发布订阅模式
耦合度 中(Subject 知道 Observer) 低(完全解耦)
通信方式 直接调用 通过中间媒介
是否同步 通常同步 可同步可异步
使用范围 单应用内 单应用 / 分布式
典型实现 Java Observable / 自定义接口 EventBus、RabbitMQ、Kafka
扩展性 一般 非常好

三、Java 中的典型实现

1. 观察者模式(Java 原生)

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

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

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

Java 自带的 java.util.Observable 已过时,不推荐


2. 发布订阅模式(Guava EventBus 示例)

EventBus bus = new EventBus();

bus.register(subscriber);
bus.post(new MessageEvent("hello"));
  • Publisher 不知道谁订阅
  • 可异步(AsyncEventBus)

四、如何选择?

✅ 使用 观察者模式 当:

  • 对象关系简单
  • 同一个 JVM 内
  • 需要明确知道观察关系

✅ 使用 发布订阅模式 当:

  • 模块 / 服务之间解耦
  • 需要异步处理
  • 系统复杂度高或分布式

五、一句话总结

观察者模式是“你盯着我”,发布订阅是“我们都盯着公告板”。

如果你愿意,我也可以帮你画 UML 图 或写 完整可运行示例。

向AI问一下细节

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

AI
助
手