观察者模式
观察者模式定义了对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都会自动收到通知并更新。
核心概念
- 主题(Subject):被观察的对象,状态改变时通知观察者
- 观察者(Observer):监听主题状态变化的对象
- 通知机制:主题维护观察者列表,状态改变时遍历通知
观察者接口
java
interface Observer {
void update(String weather, int temperature);
}主题接口
java
interface Subject {
void addObserver(Observer observer); // 添加观察者
void removeObserver(Observer observer); // 移除观察者
void notifyObservers(); // 通知所有观察者
}主题实现类
java
// 具体主题:天气站
class WeatherStation implements Subject {
private List<Observer> observers; // 观察者列表
private String weather; // 天气状况
private int temperature; // 温度
public WeatherStation() {
this.observers = new ArrayList<>();
}
// 添加观察者
@Override
public void addObserver(Observer observer) {
observers.add(observer);
System.out.println("新观察者已添加,当前观察者数量: " + observers.size());
}
// 移除观察者
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
System.out.println("观察者已移除,当前观察者数量: " + observers.size());
}
// 通知所有观察者
@Override
public void notifyObservers() {
System.out.println("\n📢 天气站广播:天气更新!");
for (Observer observer : observers) {
observer.update(weather, temperature);
}
System.out.println("通知完成 ✅\n");
}
// 设置天气数据(状态改变)
public void setWeatherData(String weather, int temperature) {
System.out.println("🌤️ 天气站检测到天气变化...");
this.weather = weather;
this.temperature = temperature;
notifyObservers(); // 状态改变,通知观察者
}
// 获取当前天气
public String getCurrentWeather() {
return weather + ", " + temperature + "°C";
}
}观察者实现类
java
// 具体观察者1:手机App
class PhoneApp implements Observer {
private String name;
public PhoneApp(String name) {
this.name = name;
}
@Override
public void update(String weather, int temperature) {
System.out.println("📱 " + name + " 收到天气更新:");
System.out.println(" 天气: " + weather + " | 温度: " + temperature + "°C");
// 根据天气给出建议
if (temperature > 30) {
System.out.println(" 💡 建议: 天气炎热,注意防暑降温!");
} else if (temperature < 10) {
System.out.println(" 💡 建议: 天气寒冷,记得添加衣物!");
} else {
System.out.println(" 💡 建议: 天气宜人,适合外出活动!");
}
}
}
// 具体观察者2:电视台
class TVStation implements Observer {
private String channelName;
public TVStation(String channelName) {
this.channelName = channelName;
}
@Override
public void update(String weather, int temperature) {
System.out.println("📺 " + channelName + " 播报天气:");
System.out.println(" 现在为您播报最新天气情况");
System.out.println(" 当前天气: " + weather + ",气温: " + temperature + "°C");
System.out.println(" 请观众朋友们关注天气变化,合理安排出行");
}
}测试
java
public class Main {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
// 创建观察者
PhoneApp phoneApp = new PhoneApp("张三");
TVStation tVStation = new TVStation("中央电视台");
// 注册观察者
weatherStation.addObserver(phoneApp);
weatherStation.addObserver(tVStation);
// 设置天气信息
weatherStation.setWeatherData("晴天", 25);
// 通知观察者
weatherStation.notifyObservers();
}
}输出
powershell
新观察者已添加,当前观察者数量: 1
新观察者已添加,当前观察者数量: 2
🌤️ 天气站检测到天气变化...
📢 天气站广播:天气更新!
📱 张三 收到天气更新:
天气: 晴天 | 温度: 25°C
💡 建议: 天气宜人,适合外出活动!
📺 中央电视台 播报天气:
现在为您播报最新天气情况
当前天气: 晴天,气温: 25°C
请观众朋友们关注天气变化,合理安排出行
通知完成 ✅
📢 天气站广播:天气更新!
📱 张三 收到天气更新:
天气: 晴天 | 温度: 25°C
💡 建议: 天气宜人,适合外出活动!
📺 中央电视台 播报天气:
现在为您播报最新天气情况
当前天气: 晴天,气温: 25°C
请观众朋友们关注天气变化,合理安排出行
通知完成 ✅