温馨提示×

温馨提示×

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

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

java中observer模式有哪几种

发布时间:2026-10-24 14:18:29 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

在 Java 中,Observer(观察者)模式的实现方式主要有以下几类/几种,从“语言原生支持”到“框架/第三方实现”都有:


一、Java 原生支持的 Observer 模式

1. java.util.Observer + java.util.Observable(已过时)

这是 Java 最早的观察者模式实现。

组成:

  • Observable:被观察者
  • Observer:观察者

示例:

class Subject extends Observable {
    void changeData(String data) {
        setChanged();
        notifyObservers(data);
    }
}

class MyObserver implements Observer {
    public void update(Observable o, Object arg) {
        System.out.println("收到数据:" + arg);
    }
}

✅ 优点:简单
❌ 缺点:

  • Java 9 已标记为 Deprecated
  • 只能继承 Observable(单继承限制)
  • 不够灵活

二、基于 EventListener 机制的观察者模式(GUI / 事件驱动)

2. 事件监听模式(AWT / Swing / JavaFX)

这是观察者模式在 GUI 中的典型应用。

例子:

button.addActionListener(e -> {
    System.out.println("按钮被点击");
});

本质:

  • 被观察者 = 组件(Button)
  • 观察者 = Listener
  • 通知 = 事件触发

✅ 常用于:

  • Swing
  • JavaFX
  • Servlet(如 HttpSessionListener)

三、Java 自定义 Observer 模式(最常用)

3. 自己实现 Observer 接口(推荐)

不依赖过期 API,完全可控。

示例:

interface Observer {
    void update(String msg);
}

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

    void add(Observer o) { observers.add(o); }
    void notify(String msg) {
        observers.forEach(o -> o.update(msg));
    }
}

✅ 优点:

  • 灵活
  • 无继承限制
  • 易扩展

四、Java 并发 / 异步观察者模式

4. java.util.concurrent 实现异步观察者

结合线程池或 CompletableFuture。

observers.forEach(o ->
    executor.submit(() -> o.update(msg))
);

或:

CompletableFuture.runAsync(() -> o.update(msg));

✅ 适合:

  • 高并发
  • 消息推送
  • 日志、监控

五、现代 Java 推荐方式(Java 8+)

5. 使用 Function / Consumer 作为观察者

函数式接口替代 Observer 接口。

List<Consumer<String>> listeners = new ArrayList<>();

void onMessage(Consumer<String> c) {
    listeners.add(c);
}

调用:

onMessage(msg -> System.out.println(msg));

✅ 优点:

  • 代码简洁
  • 符合 Java 8+ 风格

六、Spring / 框架中的 Observer 模式

6. Spring 事件机制(ApplicationListener)

Spring 本质就是观察者模式。

@Component
public class MyListener implements ApplicationListener<MyEvent> {
    public void onApplicationEvent(MyEvent e) {
        // 处理事件
    }
}

✅ 特点:

  • 解耦
  • 支持异步(@Async)
  • 企业级首选

七、消息中间件(分布式观察者)

严格说已超出“设计模式”,但是观察者思想的延伸:

  • Kafka
  • RabbitMQ
  • Redis Pub/Sub

✅ 跨 JVM / 跨服务


总结对照表

类型 是否推荐 说明
Observable / Observer ❌ 已过时
事件监听 ✅ GUI / Web
自定义 Observer ✅✅ 最常用
函数式 Observer ✅✅ Java 8+
Spring 事件 ✅✅✅ 企业级
MQ ✅✅✅ 分布式

如果你愿意,我可以:

  • 给你 UML 图
  • 对比 Observer vs Pub/Sub
  • 写一个 完整可运行 Demo
  • 或按 面试角度 总结

你想要哪一种?

向AI问一下细节

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

AI
助
手