设计模式-观察者模式

观察者模式是一种行为设计模式 ,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新 。这种模式常用于实现事件驱动的系统,例如用户界面、订阅-发布系统等。

以下是一个简单的Java实现案例,模拟天气预报服务与多个显示设备之间的关系:

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 List<Observer> observers = 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");
    }
}

在这个例子中:

  1. WeatherSubject 是被观察者接口,定义了注册、移除和通知观察者的方法。
  2. WeatherStation 实现了 WeatherSubject 接口,表示天气观测站,当天气数据变化时,会通知所有注册的观察者。
  3. Observer 是观察者接口,定义了更新方法,当收到通知时,观察者会执行该方法。
  4. WeatherDisplay 是具体的观察者类,实现了 Observer 接口,当收到天气数据更新时,它会更新自己的显示。
  5. Client 类是客户端代码,创建了天气观测站和两个显示设备,并将它们注册为观察者,然后模拟了两次天气数据的变化。

当天气观测站的天气数据变化时,它会调用 notifyObservers方法,通知所有注册的观察者(这里是两个 WeatherDisplay 实例),这些观察者接收到通知后,通过 update 方法更新自己的状态。

相关推荐
千千寰宇20 分钟前
[设计模式/Java] 设计模式之解释器模式【27】
数据库·设计模式
麓殇⊙37 分钟前
设计模式-- 原型模式详解
设计模式·原型模式
电子科技圈42 分钟前
XMOS空间音频——在任何设备上都能提供3D沉浸式空间音频且实现更安全地聆听
经验分享·设计模式·性能优化·计算机外设·音视频
智想天开1 小时前
11.原型模式:思考与解读
设计模式·原型模式
XiaoLeisj1 小时前
【设计模式】深入解析代理模式(委托模式):代理模式思想、静态模式和动态模式定义与区别、静态代理模式代码实现
java·spring boot·后端·spring·设计模式·代理模式·委托模式
星星点点洲6 小时前
【设计模式区别】装饰器模式和适配器模式区别
设计模式·适配器模式·装饰器模式
Tang10246 小时前
分析 Android Jetpack Lifecycle 的设计思想及其与生命周期感知组件的交互原理
设计模式
?abc!6 小时前
设计模式基础概念(结构型模式):适配器模式(Adapter Pattern)
python·设计模式·适配器模式
ApeAssistant7 小时前
Spring + 设计模式 (十八) 行为型 - 责任链模式
spring·设计模式
前端大白话8 小时前
震惊!90%前端工程师都踩过的坑!Vue中`$el`和`$refs`获取DOM元素的10大区别与实战指南
前端·vue.js·设计模式