Java 观察者模式详解:核心概念、实现原理与代码示例

雨后青山
雨后青山
发布时间:2026-10-13| 4人浏览过
原创

观察者模式用于建立对象间的一对多依赖,使主题变化能自动通知所有注册者。本文将深入解析 Java 中的实现方式,包括接口定义、集合管理及完整的测试用例,助力掌握这一经典设计模式。

观察者模式的核心概念

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会通知所有注册的观察者对象,使它们能够自动做出相应的响应或更新。

这种模式广泛应用于事件处理系统、GUI 界面开发以及消息推送场景。其核心价值在于实现了“发布-订阅”机制的解耦:主题无需知道观察者的具体实现,只需维护一个观察者列表并统一触发通知。

Java 中的实现架构

在 Java 中实现标准的观察者模式,通常需要定义以下两个关键角色:

  • 观察者(Observer):定义更新接口。所有需要接收通知的对象必须实现此接口。
  • 被观察者/主题(Subject/Observable):负责管理观察者的注册、移除,并在状态改变时遍历列表进行通知。

第1步:定义观察者接口

首先创建 Observer 接口,确立统一的更新方法签名。这是解耦的关键,确保主题只依赖抽象而非具体类。

/**
 * 观察者接口:观察者需实现此接口以接收更新
 */
public interface Observer {
    public void update(Object obj);
}

第2步:定义被观察者接口

接着定义 BeenObserved 接口(或称 Subject),包含添加、移除观察者和发送通知的方法。采用接口形式便于后续扩展为抽象类实现。

/**
 * 被观察者接口:管理观察者集合及通知分发
 */
public interface BeenObserved {
    public void addObserver(Observer obs);       // 添加观察者
    public void removeObserver(Observer obs);    // 移除观察者
    public void notifyObservers(String changed); // 触发通知
}

第3步:实现具体主题类

ConcreteWatched 是实现类,内部使用 List<Observer> 维护观察者列表。注意在添加和移除时需检查是否存在,避免重复或空指针异常;通知时则逐个调用更新方法。

/**
 * 具体的被观察者实现
 */
public class ConcreteWatched implements BeenObserved {
    // 维护观察者集合
    private List<Observer> list = new ArrayList<>();

    @Override
    public void addObserver(Observer obs) {
        if (!list.contains(obs)) {
            list.add(obs);
        }
    }

    @Override
    public void removeObserver(Observer obs) {
        if (list.contains(obs)) {
            list.remove(obs);
        }
    }

    @Override
    public void notifyObservers(String change) {
        // 遍历所有观察者并执行更新
        for (Observer obs : list) {
            obs.update(change);
        }
    }
}

第4步:实现具体观察者类

具体观察者类实现 Observer 接口,定义接收到通知后的实际业务逻辑。在此示例中,仅打印收到的数据。

/**
 * 具体的观察者实现
 */
public class SpecificWatcher implements Observer {
    @Override
    public void update(Object obj) {
        System.out.println("收到通知:" + obj.toString());
    }
}

完整测试流程与结果验证

通过 Test 类验证模式的有效性。测试分为两个阶段:先添加三个观察者并触发一次通知,再移除一个观察者后再次触发,观察输出差异。

/**
 * 测试入口
 */
public class Test {
    public static void main(String[] args) {
        // 1. 初始化主题
        BeenObserved bObs = new ConcreteWatched();
        
        // 2. 创建并注册三个观察者
        Observer obs1 = new SpecificWatcher();
        Observer obs2 = new SpecificWatcher();
        Observer obs3 = new SpecificWatcher();

        bObs.addObserver(obs1);
        bObs.addObserver(obs2);
        bObs.addObserver(obs3);
        
        // 3. 第一次通知:所有观察者应接收消息
        System.out.println("=== 第一次通知 ===");
        bObs.notifyObservers("***收到了通知***");

        System.out.println("----------分隔线--------------");

        // 4. 移除中间观察者
        bObs.removeObserver(obs2);
        
        // 5. 第二次通知:只有 obs1 和 obs3 响应
        System.out.println("=== 第二次通知 ===");
        bObs.notifyObservers("***少了一个观察者***");
    }
}

运行上述代码,控制台将按预期输出两次通知结果。第一次包含三条日志,第二次仅包含两条,证明移除操作生效且通知机制正确。

总结与应用建议

观察者模式是实现松散耦合的有力工具。在 Java 开发中,若涉及状态变更广播(如 UI 控件联动、消息队列监听器),可参考此结构。需注意:notifyObservers 应当保持轻量,避免阻塞;若观察者众多,应考虑异步线程池处理以提升性能。

以上就是 Java 观察者模式实现的详细内容,更多关于 Java 设计模式与事件驱动开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。