简单例子讲明白观察者模式,不得不会
·
目录
一、一句话理解观察者模式
当一个对象(被观察者)状态改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。
就像:
👉 你关注了一个微信公众号(订阅),
👉 当它发布新文章时,
👉 所有订阅的用户都会收到推送通知。
这就是典型的 观察者模式!
二、角色说明(三大角色)
| 角色 | 作用 |
|---|---|
| Subject(主题 / 被观察者) | 维护观察者列表,状态变化时通知所有人 |
| Observer(观察者) | 接收通知,执行自己的逻辑(如刷新、提醒) |
| Client(客户端) | 创建对象,建立订阅关系 |
三、生活例子:天气站 + 手机App
假设有一个天气站(Subject),实时监测温度。
有多个 App(Observer)显示天气:
- 手机天气 App
- 智能手表天气 Widget
- 网站天气板块
一旦温度变化,所有 App 自动更新。
四、Java 实现代码(标准观察者模式)
1. 定义观察者接口(Observer)
// 观察者接口
public interface Observer {
void update(float temperature);
}
2. 定义被观察者接口(Subject)
import java.util.List;
// 被观察者接口
public interface Subject {
void registerObserver(Observer o); // 添加观察者
void removeObserver(Observer o); // 删除观察者
void notifyObservers(); // 通知所有观察者
}
3. 具体被观察者:天气站 WeatherData
import java.util.ArrayList;
import java.util.List;
public class WeatherData implements Subject {
private List<Observer> observers;
private float temperature; // 温度
public WeatherData() {
this.observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature);
}
}
// 当温度变化时,调用此方法(内部自动通知所有App)
public void setTemperature(float temperature) {
this.temperature = temperature;
System.out.println("【天气站】温度已更新为: " + temperature + "°C");
notifyObservers(); // 通知所有观察者
}
}
4. 具体观察者:手机App、手表等
手机App 显示天气
public class PhoneDisplay implements Observer {
private float temperature;
@Override
public void update(float temperature) {
this.temperature = temperature;
display();
}
public void display() {
System.out.println("📱 手机App:当前温度是 " + temperature + "°C");
}
}
手表显示天气
public class WatchDisplay implements Observer {
private float temperature;
@Override
public void update(float temperature) {
this.temperature = temperature;
display();
}
public void display() {
System.out.println("⌚ 智能手表:气温 " + temperature + "°C");
}
}
5. 测试类(Client)
public class ObserverPatternDemo {
public static void main(String[] args) {
// 创建被观察者:天气站
WeatherData weatherData = new WeatherData();
// 创建观察者:两个App
Observer phoneApp = new PhoneDisplay();
Observer watchApp = new WatchDisplay();
// 注册订阅关系
weatherData.registerObserver(phoneApp);
weatherData.registerObserver(watchApp);
// 模拟温度变化 → 自动通知所有App
weatherData.setTemperature(25.5f);
System.out.println();
weatherData.setTemperature(28.0f);
System.out.println();
// 取消手表订阅
weatherData.removeObserver(watchApp);
System.out.println("【智能手表取消订阅】");
weatherData.setTemperature(30.2f);
}
}
6. 运行结果

五、总结:观察者模式的核心思想
| 特点 | 说明 |
|---|---|
| 松耦合 | 被观察者不关心观察者具体是谁,只通知 |
| 动态订阅/取消 | 可随时添加或移除观察者 |
| 一对多通知 | 一个变化,多个响应 |
| 事件驱动 | 响应式编程的基础(如Spring事件、RxJava) |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)