温馨提示×

温馨提示×

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

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

怎样实现java观察者模式

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

Java 中**观察者模式(Observer Pattern)**常见有三种实现方式:JDK 自带 API、自定义实现、Spring 事件机制。下面从最基础到实用逐步说明。


一、JDK 自带观察者模式(java.util)

1️⃣ 被观察者(Subject)

继承 Observable

import java.util.Observable;

public class WeatherData extends Observable {
    private float temperature;

    public void setTemperature(float temperature) {
        this.temperature = temperature;
        setChanged();           // 标记状态改变
        notifyObservers(temperature); // 通知观察者
    }
}

2️⃣ 观察者(Observer)

实现 Observer 接口

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

public class Display implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("温度更新为:" + arg);
    }
}

3️⃣ 使用

public class Test {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        Display display = new Display();

        weatherData.addObserver(display);
        weatherData.setTemperature(26.5f);
    }
}

✅ 优点:简单
❌ 缺点:Observable 是类,不能多继承(Java 限制)


二、自定义观察者模式(推荐、最常用)

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<>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void notify(String message) {
        for (Observer o : observers) {
            o.update(message);
        }
    }
}

3️⃣ 实现观察者

public class User implements Observer {
    private String name;

    public User(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();
        subject.attach(new User("张三"));
        subject.attach(new User("李四"));

        subject.notify("系统更新了!");
    }
}

✅ 灵活、可扩展
✅ 符合设计原则


三、Spring 中的观察者(事件驱动)

1️⃣ 定义事件

import org.springframework.context.ApplicationEvent;

public class OrderEvent extends ApplicationEvent {
    public OrderEvent(Object source) {
        super(source);
    }
}

2️⃣ 监听器

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class OrderListener {

    @EventListener
    public void handleOrder(OrderEvent event) {
        System.out.println("收到订单事件:" + event.getSource());
    }
}

3️⃣ 发布事件

@Autowired
private ApplicationEventPublisher publisher;

public void createOrder() {
    publisher.publishEvent(new OrderEvent("订单123"));
}

✅ 企业级项目首选
✅ 解耦、异步支持好


四、使用场景总结

✅ 适用于:

  • 状态变化通知
  • 消息推送
  • 事件驱动架构
  • 解耦业务模块

❌ 不适合:

  • 强实时性
  • 高频调用(需考虑性能)

如果你愿意,我可以:

  • 给你 UML 图
  • 写 异步观察者
  • 对比 观察者 vs 发布订阅
  • 用 真实业务例子(如订单、日志)

你想看哪一种?

向AI问一下细节

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

AI
助
手