观察者模式 (Observer)
📖 通俗理解
关注微信公众号:
- 你关注了一个公众号
- 公众号发布新文章时,自动推送给你
- 你不需要每天去检查是否有新文章
观察者模式就是:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖它的对象都会收到通知。
🎯 解决什么问题?
当一个对象的改变需要同时改变其他对象时,而且不知道具体有多少对象要改变。
🌰 生活中的例子
- 公众号订阅
- 气象站发布天气
- 股票价格变动通知
- 邮件订阅
💻 Java 代码实现
场景:天气预报发布
/**
* 观察者接口
*/
public interface Observer {
void update(float temperature, float humidity);
}
/**
* 主题接口
*/
public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
/**
* 天气数据(主题)
*/
public class WeatherData implements Subject {
private List<Observer> observers = new ArrayList<>();
private float temperature;
private float humidity;
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer o : observers) {
o.update(temperature, humidity);
}
}
public void setWeather(float temperature, float humidity) {
this.temperature = temperature;
this.humidity = humidity;
System.out.println("\n📢 天气更新: 温度=" + temperature + "°C, 湿度=" + humidity + "%");
notifyObservers();
}
}
/**
* 手机 App(观察者)
*/
public class PhoneApp implements Observer {
private String appName;
public PhoneApp(String appName) {
this.appName = appName;
}
@Override
public void update(float temperature, float humidity) {
System.out.println("📱 " + appName + " 收到通知: 当前温度 " + temperature + "°C");
}
}
/**
* 电子显示屏(观察者)
*/
public class DisplayBoard implements Observer {
private String location;
public DisplayBoard(String location) {
this.location = location;
}
@Override
public void update(float temperature, float humidity) {
System.out.println("🖥️ " + location + "显示屏: 温度 " + temperature + "°C, 湿度 " + humidity + "%");
}
}
使用:
public class Client {
public static void main(String[] args) {
// 创建天气数据(主题)
WeatherData weatherData = new WeatherData();
// 创建观察者
Observer phoneApp = new PhoneApp("天气通");
Observer displayBoard = new DisplayBoard("广场");
// 注册观察者
weatherData.registerObserver(phoneApp);
weatherData.registerObserver(displayBoard);
// 更新天气
weatherData.setWeather(26.5f, 65);
weatherData.setWeather(28.0f, 70);
}
}
输出:
📢 天气更新: 温度=26.5°C, 湿度=65.0%
📱 天气通 收到通知: 当前温度 26.5°C
🖥️ 广场显示屏: 温度 26.5°C, 湿度 65.0%
📢 天气更新: 温度=28.0°C, 湿度=70.0%
📱 天气通 收到通知: 当前温度 28.0°C
🖥️ 广场显示屏: 温度 28.0°C, 湿度 70.0%
🔥 Java 内置观察者
Java 提供了 java.util.Observable 和 java.util.Observer(JDK 9 已废弃),推荐使用自定义实现或响应式框架。
✅ 适用场景
- 当一个对象改变需要通知其他对象
- 不知道具体有多少对象需要通知
- 对象之间松耦合
小结
观察者模式:一对多的依赖关系,一变多变。
应用:事件监听、消息订阅、Spring 事件机制
👉 下一篇:状态模式
