观察者模式就是一个对象在被调用或者初始化的时候,去触发其他对象的方法
每当发布天气预报时,会通知当地的居民,居民就是观察者(Observer),天气预报就是被观察者(Subject)
java
/**
* \观察者接口
*/
interface Observer {
void update(WeatherData weatherData);
}
java
/**
* 具体的居民类(观察者类)
*/
class ConcreteResident implements Observer {
private String name;
public ConcreteResident(String name) {
this.name = name;
}
public void update(WeatherData weatherData) {
System.out.println(name + " 收到天气预报,温度:" + weatherData.getTemperature() + "℃,湿度:" + weatherData.getHumidity() + "%。");
}
}
当被观察者发生变化时,会通知已添加在主体列表中的观察者
java
/**
* // 天气预报中心接口(主题接口)
*/
public interface WeatherCenter {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(WeatherData weatherData);
}
java
import java.util.ArrayList;
import java.util.List;
/**
* 具体的天气预报中心类
*/
class ConcreteWeatherCenter implements WeatherCenter {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(WeatherData weatherData) {
for (Observer observer : observers) {
observer.update(weatherData);
}
}
}
测试实例
java
public class ObserverPatternDemo {
public static void main(String[] args) {
// 创建天气预报中心
WeatherCenter weatherCenter = new ConcreteWeatherCenter();
// 创建居民(观察者)
Observer resident1 = new ConcreteResident("居民A");
Observer resident2 = new ConcreteResident("居民B");
// 注册观察者
weatherCenter.addObserver(resident1);
weatherCenter.addObserver(resident2);
// 发布新的天气数据
WeatherData weatherData = new WeatherData(25.0f, 60.0f);
weatherCenter.notifyObservers(weatherData);
// 输出:
// 居民A 收到天气预报,温度:25.0℃,湿度:60.0%。
// 居民B 收到天气预报,温度:25.0℃,湿度:60.0%。
// 如果需要移除某个观察者,可以调用 removeObserver 方法
// weatherCenter.removeObserver(resident1);
}
}