[行为型模式]观察者模式
- 手机观察者:
PhoneDisplay
- 平板观察者:
TabletDisplay
- 电脑观察者:
ComputerDisplay
每个观察者都实现相同的接口 Observer
,但具有不同的显示逻辑。
🧱 示例结构
类名 | 类型 | 功能描述 |
---|---|---|
Subject | 接口 | 定义注册、移除和通知方法 |
WeatherData | 具体主题 | 维护观察者并发送更新通知 |
Observer | 接口 | 定义观察者的更新行为 |
PhoneDisplay | 观察者 | 手机端展示天气信息 |
TabletDisplay | 观察者 | 平板端展示天气信息 |
ComputerDisplay | 观察者 | 电脑端展示天气信息 |
🔧 接口定义(不变)
Observer
接口
public interface Observer {void update(float temperature, float humidity, float pressure);
}
Subject
接口
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}
被观察者举例实现
import java.util.ArrayList;
import java.util.List;public class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObservers();}
}
🏗️ 多个观察者实现
1. 手机观察者 PhoneDisplay
public class PhoneDisplay implements Observer {private float temperature;private float humidity;private Subject weatherData;public PhoneDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("[手机] 当前天气: 温度=" + temperature + "°C, 湿度=" + humidity + "%");}
}
2. 平板观察者 TabletDisplay
public class TabletDisplay implements Observer {private float temperature;private float humidity;private Subject weatherData;public TabletDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("[平板] 实时气象数据 - 温度:" + temperature + "°C,湿度:" + humidity + "%");}
}
3. 电脑观察者 ComputerDisplay
public class ComputerDisplay implements Observer {private float temperature;private float humidity;private float pressure;private Subject weatherData;public ComputerDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;display();}public void display() {System.out.println("[电脑] 天气详情:温度=" + temperature + "°C,湿度=" + humidity + "%,气压=" + pressure + "hPa");}
}
🧪 测试客户端代码
public class Client {public static void main(String[] args) {WeatherData weatherData = new WeatherData();// 注册三个不同设备的观察者PhoneDisplay phone = new PhoneDisplay(weatherData);TabletDisplay tablet = new TabletDisplay(weatherData);ComputerDisplay computer = new ComputerDisplay(weatherData);// 模拟数据变化System.out.println("第一次更新数据:");weatherData.setMeasurements(25, 65, 1013);System.out.println("\n第二次更新数据:");weatherData.setMeasurements(27, 70, 1012);}
}
✅ 输出结果示例
第一次更新数据:
[手机] 当前天气: 温度=25.0°C, 湿度=65.0%
[平板] 实时气象数据 - 温度:25.0°C,湿度:65.0%
[电脑] 天气详情:温度=25.0°C,湿度=65.0%,气压=1013.0hPa第二次更新数据:
[手机] 当前天气: 温度=27.0°C, 湿度=70.0%
[平板] 实时气象数据 - 温度:27.0°C,湿度:70.0%
[电脑] 天气详情:温度=27.0°C,湿度=70.0%,气压=1012.0hPa
📌 总结
通过引入多个观察者(如手机、平板、电脑),我们展示了观察者模式的灵活性与解耦能力。每个观察者都可以根据自身需求独立处理更新内容,而无需关心数据是如何产生的。