观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的系统,例如用户界面、订阅-发布系统等。
以下是一个简单的Java实现案例,模拟天气预报服务与多个显示设备之间的关系:
// 1. 定义观察者接口 public interface Observer { // 2. 定义更新方法,参数为观察者所关注的对象 void update(String obj); } // 2. 定义被观察者接口 public interface WeatherSubject { // 3. 定义注册、移除观察者、通知观察者方法 void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(String weatherData); } // 3. 具体的被观察者类 public class WeatherStation implements WeatherSubject { // 观察者列表 private Listobservers = new ArrayList<>(); @Override public void registerObserver(Observer observer) { // 将观察者放到观察者列表 observers.add(observer); } @Override public void removeObserver(Observer observer) { // 从观察者列表中移除观察者 observers.remove(observer); } @Override public void notifyObservers(String weatherData) { // 通知所有观察者 for (Observer observer : observers) { observer.update(weatherData); } } // 假设获取到新的天气数据 public void setWeatherData(String weatherData) { // 这里可以是实际从服务器获取的天气数据 notifyObservers(weatherData); } } // 4. 具体的观察者类 public class WeatherDisplay implements Observer { // 观察者的状态 private String currentWeather; @Override public void update(String weatherData) { System.out.println("Weather Display received data: " + weatherData); // 更新显示 this.currentWeather = weatherData; display(); } private void display() { System.out.println("Current weather: " + currentWeather); } } public class Client { public static void main(String[] args) { WeatherStation weatherStation = new WeatherStation(); WeatherDisplay weatherDisplay1 = new WeatherDisplay(); WeatherDisplay weatherDisplay2 = new WeatherDisplay(); // 注册观察者 weatherStation.registerObserver(weatherDisplay1); weatherStation.registerObserver(weatherDisplay2); // 被观察者发出新天气数据 weatherStation.setWeatherData("sunny"); weatherStation.setWeatherData("Rainy"); } }
在这个例子中:
- WeatherSubject 是被观察者接口,定义了注册、移除和通知观察者的方法。
- WeatherStation 实现了 WeatherSubject 接口,表示天气观测站,当天气数据变化时,会通知所有注册的观察者。
- Observer 是观察者接口,定义了更新方法,当收到通知时,观察者会执行该方法。
- WeatherDisplay 是具体的观察者类,实现了 Observer 接口,当收到天气数据更新时,它会更新自己的显示。
- Client 类是客户端代码,创建了天气观测站和两个显示设备,并将它们注册为观察者,然后模拟了两次天气数据的变化。
当天气观测站的天气数据变化时,它会调用 notifyObservers 方法,通知所有注册的观察者(这里是两个 WeatherDisplay 实例),这些观察者接收到通知后,通过 update 方法更新自己的状态。
还没有评论,来说两句吧...