温馨提示×

温馨提示×

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

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

java观察者模式怎么实现

发布时间:2026-10-24 11:56:22 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 中,**观察者模式(Observer Pattern)**通常有两种实现方式:

  1. 使用 JDK 自带的 Observer / Observable(已过时,不推荐)
  2. ✅ 自己实现观察者模式(推荐,最常用)
  3. (扩展)使用 Spring 事件机制 / Guava EventBus

下面重点讲 第 2 种:手写观察者模式,最清晰也最常用。


一、观察者模式核心角色

角色 说明
Subject(被观察者) 状态发生变化时通知观察者
Observer(观察者) 接收通知并做出响应

二、手写观察者模式(标准实现)

1️⃣ 定义观察者接口

public interface Observer {
    void update(String message);
}

2️⃣ 定义被观察者(Subject)

import java.util.ArrayList;
import java.util.List;

public class Subject {

    private List<Observer> observers = new ArrayList<>();
    private String state;

    // 注册观察者
    public void attach(Observer observer) {
        observers.add(observer);
    }

    // 移除观察者
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    // 状态变化
    public void setState(String state) {
        this.state = state;
        notifyAllObservers();
    }

    // 通知所有观察者
    private void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}

3️⃣ 实现具体观察者

public class UserObserver implements Observer {
    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(name + " 收到消息:" + message);
    }
}

4️⃣ 测试代码

public class Test {
    public static void main(String[] args) {
        Subject subject = new Subject();

        Observer o1 = new UserObserver("张三");
        Observer o2 = new UserObserver("李四");

        subject.attach(o1);
        subject.attach(o2);

        subject.setState("天气变冷了,记得加衣服");
    }
}

✅ 输出:

张三 收到消息:天气变冷了,记得加衣服
李四 收到消息:天气变冷了,记得加衣服

三、JDK 自带的观察者(了解即可 ❌不推荐)

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

⚠️ 问题:

  • Observable 是类,不能多继承
  • Java 9 已标记为 @Deprecated

四、实际开发推荐方案

✅ Spring 事件(最常用)

@Component
public class MyEventListener {
    @EventListener
    public void handle(MyEvent event) {
        // 处理逻辑
    }
}

✅ Guava EventBus(轻量)

@Subscribe
public void onMessage(String msg) {}

五、适用场景

  • 消息通知
  • 状态变更广播
  • 发布-订阅系统
  • UI 事件监听
  • 日志、监控、告警

如果你愿意,我可以:

  • ✅ 用 真实业务例子(订单、库存)讲
  • ✅ 画 UML 类图
  • ✅ 对比 观察者 vs 发布订阅

你想看哪一个?

向AI问一下细节

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

AI
助
手