Skip to content

观察者模式

观察者模式定义了对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都会自动收到通知并更新。

核心概念

  • 主题(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
   请观众朋友们关注天气变化,合理安排出行
通知完成 ✅

如有转载或 CV 的请标注本站原文地址

访客数 --| 总访问量 --