23种设计模式23种设计模式
首页
介绍
  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式
  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰器模式
  • 外观模式
  • 享元模式
  • 代理模式
  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式
  • 模板方法模式
  • 访问者模式
🚀 编程指南
首页
介绍
  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式
  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰器模式
  • 外观模式
  • 享元模式
  • 代理模式
  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式
  • 模板方法模式
  • 访问者模式
🚀 编程指南
  • 行为型模式

    • 责任链模式 (Chain of Responsibility)
    • 命令模式 (Command)
    • 解释器模式 (Interpreter)
    • 迭代器模式 (Iterator)
    • 中介者模式 (Mediator)
    • 备忘录模式 (Memento)
    • 观察者模式 (Observer)
    • 状态模式 (State)
    • 策略模式 (Strategy)
    • 模板方法模式 (Template Method)
    • 访问者模式 (Visitor)

观察者模式 (Observer)

📖 通俗理解

关注微信公众号:

  • 你关注了一个公众号
  • 公众号发布新文章时,自动推送给你
  • 你不需要每天去检查是否有新文章

观察者模式就是:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖它的对象都会收到通知。

🎯 解决什么问题?

当一个对象的改变需要同时改变其他对象时,而且不知道具体有多少对象要改变。

🌰 生活中的例子

  • 公众号订阅
  • 气象站发布天气
  • 股票价格变动通知
  • 邮件订阅

💻 Java 代码实现

场景:天气预报发布

/**
 * 观察者接口
 */
public interface Observer {
    void update(float temperature, float humidity);
}

/**
 * 主题接口
 */
public interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

/**
 * 天气数据(主题)
 */
public class WeatherData implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private float temperature;
    private float humidity;
    
    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }
    
    @Override
    public void removeObserver(Observer o) {
        observers.remove(o);
    }
    
    @Override
    public void notifyObservers() {
        for (Observer o : observers) {
            o.update(temperature, humidity);
        }
    }
    
    public void setWeather(float temperature, float humidity) {
        this.temperature = temperature;
        this.humidity = humidity;
        System.out.println("\n📢 天气更新: 温度=" + temperature + "°C, 湿度=" + humidity + "%");
        notifyObservers();
    }
}

/**
 * 手机 App(观察者)
 */
public class PhoneApp implements Observer {
    private String appName;
    
    public PhoneApp(String appName) {
        this.appName = appName;
    }
    
    @Override
    public void update(float temperature, float humidity) {
        System.out.println("📱 " + appName + " 收到通知: 当前温度 " + temperature + "°C");
    }
}

/**
 * 电子显示屏(观察者)
 */
public class DisplayBoard implements Observer {
    private String location;
    
    public DisplayBoard(String location) {
        this.location = location;
    }
    
    @Override
    public void update(float temperature, float humidity) {
        System.out.println("🖥️ " + location + "显示屏: 温度 " + temperature + "°C, 湿度 " + humidity + "%");
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        // 创建天气数据(主题)
        WeatherData weatherData = new WeatherData();
        
        // 创建观察者
        Observer phoneApp = new PhoneApp("天气通");
        Observer displayBoard = new DisplayBoard("广场");
        
        // 注册观察者
        weatherData.registerObserver(phoneApp);
        weatherData.registerObserver(displayBoard);
        
        // 更新天气
        weatherData.setWeather(26.5f, 65);
        weatherData.setWeather(28.0f, 70);
    }
}

输出:

📢 天气更新: 温度=26.5°C, 湿度=65.0%
📱 天气通 收到通知: 当前温度 26.5°C
🖥️ 广场显示屏: 温度 26.5°C, 湿度 65.0%

📢 天气更新: 温度=28.0°C, 湿度=70.0%
📱 天气通 收到通知: 当前温度 28.0°C
🖥️ 广场显示屏: 温度 28.0°C, 湿度 70.0%

🔥 Java 内置观察者

Java 提供了 java.util.Observable 和 java.util.Observer(JDK 9 已废弃),推荐使用自定义实现或响应式框架。

✅ 适用场景

  1. 当一个对象改变需要通知其他对象
  2. 不知道具体有多少对象需要通知
  3. 对象之间松耦合

小结

观察者模式:一对多的依赖关系,一变多变。

应用:事件监听、消息订阅、Spring 事件机制

👉 下一篇:状态模式

Prev
备忘录模式 (Memento)
Next
状态模式 (State)