温馨提示×

温馨提示×

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

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

observer模式在java里怎么用

发布时间:2026-10-24 12:54:24 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

在 Java 里,Observer(观察者)模式通常用于“一个对象状态变化,其他对象自动收到通知”的场景。下面从原生实现和Java 自带 API两方面讲。


一、Observer 模式的核心角色

  1. Subject(被观察者)

    • 维护观察者列表
    • 提供注册 / 删除观察者方法
    • 状态变化时通知观察者
  2. Observer(观察者)

    • 定义一个更新接口
    • 被 Subject 调用

二、原生手写 Observer 模式(推荐理解原理)

1️⃣ 定义观察者接口

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

2️⃣ 定义被观察者

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 o : observers) {
            o.update(state);
        }
    }
}

3️⃣ 实现具体观察者

public class EmailObserver implements Observer {
    @Override
    public void update(String message) {
        System.out.println("Email 收到消息: " + message);
    }
}

public class SMSObserver implements Observer {
    @Override
    public void update(String message) {
        System.out.println("SMS 收到消息: " + message);
    }
}

4️⃣ 使用

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

        Observer email = new EmailObserver();
        Observer sms = new SMSObserver();

        subject.attach(email);
        subject.attach(sms);

        subject.setState("订单已支付");
    }
}

✅ 输出:

Email 收到消息: 订单已支付
SMS 收到消息: 订单已支付

三、Java 自带的 Observer(不推荐新项目用)

Java 早期提供:

  • java.util.Observable
  • java.util.Observer

⚠️ 已废弃(Java 9+),不推荐新代码使用。

示例(了解即可):

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

class News extends Observable {
    void publish(String msg) {
        setChanged();
        notifyObservers(msg);
    }
}

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

四、现代 Java 推荐方式 ✅

✅ 使用 事件机制 / 监听器

interface Listener {
    void onEvent(String msg);
}

class Publisher {
    private List<Listener> listeners = new ArrayList<>();

    void register(Listener l) {
        listeners.add(l);
    }

    void fire(String msg) {
        listeners.forEach(l -> l.onEvent(msg));
    }
}

✅ Spring 中的 Observer

@EventListener
public void handleOrderEvent(OrderEvent event) {
}

五、典型使用场景

  • GUI 事件(按钮点击)
  • 消息通知系统
  • 配置中心监听
  • 发布 / 订阅(MQ 的简化版)

如果你愿意,我可以:

  • 用 Spring Event 写完整示例
  • 对比 Observer vs 发布订阅
  • 帮你画一张 UML 图

你想看哪一种?

向AI问一下细节

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

AI
助
手