温馨提示×

温馨提示×

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

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

java观察者模式与监听区别

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

在 Java 中,观察者模式(Observer Pattern)和监听器(Listener)经常被一起提到,但它们并不是完全等价的概念。可以从设计意图、使用方式、实现机制几个角度来看区别。


一、核心概念区别

1️⃣ 观察者模式(Observer Pattern)

一种设计模式,用于一对多的依赖关系:

当一个对象(被观察者 / 主题)状态发生变化时,所有依赖它的对象(观察者)都会收到通知并自动更新。

关注点:

  • 状态变化
  • 自动通知
  • 解耦被观察者和观察者

典型示例:

  • java.util.Observable / Observer(旧 API)
  • Spring 的 ApplicationEvent + ApplicationListener

2️⃣ 监听器(Listener)

一种编程机制 / 接口约定,通常用于响应某种事件。

关注点:

  • 事件触发
  • 回调方法
  • 通常由框架调用

典型示例:

  • ActionListener(Swing)
  • ServletContextListener
  • MouseListener

二、关系说明(重点)

监听器通常是观察者模式的一种具体实现形式

✅ 观察者模式是“思想”
✅ 监听器是“实现方式之一”


三、代码层面的区别

✅ 观察者模式示例(标准)

// 观察者
interface Observer {
    void update(String msg);
}

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

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

    void notifyAll(String msg) {
        observers.forEach(o -> o.update(msg));
    }
}

特点:

  • 自己管理观察者列表
  • 主动推送变化

✅ 监听器示例(事件驱动)

// 监听器接口
interface ClickListener {
    void onClick();
}

// 事件源
class Button {
    private ClickListener listener;

    void setClickListener(ClickListener l) {
        this.listener = l;
    }

    void click() {
        if (listener != null) {
            listener.onClick();
        }
    }
}

特点:

  • 通常只有一个或少数监听器
  • 事件触发才调用

四、主要区别对比表

对比维度 观察者模式 监听器
本质 设计模式 实现机制 / 接口
通知方式 批量通知 事件触发
关注点 状态变化 行为 / 事件
耦合度 低 低
使用场景 数据变化、状态同步 UI、框架事件
是否一定事件 否 是

五、什么时候用哪个?

✅ 用观察者模式当:

  • 多个对象依赖一个对象状态
  • 需要自动同步更新
  • 业务模型层面

✅ 用监听器当:

  • 响应用户操作 / 系统事件
  • 框架已定义好接口
  • 事件驱动架构

六、一句话总结

观察者模式是“通知机制的设计思想”,监听器是“事件响应的实现方式”。

如果你愿意,我也可以:

  • 用 Spring 的事件机制对比
  • 讲 Swing / Web 中的监听器
  • 给你一个“观察者 vs 监听器”的真实项目例子
向AI问一下细节

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

AI
助
手