温馨提示×

温馨提示×

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

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

观察者模式在java中怎么用

发布时间:2026-09-13 05:57:44 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

观察者模式(Observer Pattern)是一种行为型设计模式,用于实现一对多的依赖关系:当一个对象(被观察者 / 主题)状态发生改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。

下面用 Java 从 原生实现 → JDK 自带实现 → 实际示例 三个层次说明。


一、自己手写一个观察者模式(最清晰)

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("邮件通知:" + message);
    }
}

public class SMSObserver implements Observer {
    @Override
    public void update(String message) {
        System.out.println("短信通知:" + message);
    }
}

4️⃣ 使用

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

        subject.attach(new EmailObserver());
        subject.attach(new SMSObserver());

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

✅ 输出:

邮件通知:订单已支付
短信通知:订单已支付

二、使用 Java 自带的观察者(不推荐新项目用)

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 推荐方式(最常用)

✅ 使用 EventListener / 自定义监听器

@FunctionalInterface
public interface StateListener {
    void onChange(String state);
}

public class StateHolder {
    private List<StateListener> listeners = new ArrayList<>();

    public void addListener(StateListener l) {
        listeners.add(l);
    }

    public void changeState(String state) {
        listeners.forEach(l -> l.onChange(state));
    }
}

使用:

StateHolder holder = new StateHolder();
holder.addListener(s -> System.out.println("状态变化:" + s));
holder.changeState("启动");

✅ Spring / Android / GUI 全是用这种思路


四、真实应用场景

  • GUI 按钮点击事件
  • Spring 的 ApplicationEvent
  • MQ 消息订阅
  • 配置中心推送
  • 订单状态变更通知

五、一句话总结

观察者模式 = 注册 → 通知 → 自动更新

如果你愿意,我可以:

  • 用 Spring 事件机制 写示例
  • 用 React / Vue 响应式思想 对比
  • 帮你 画 UML 类图

你想看哪一个?

向AI问一下细节

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

AI
助
手