目录

 一、一句话理解观察者模式

 二、角色说明(三大角色)

三、生活例子:天气站 + 手机App

四、Java 实现代码(标准观察者模式)

1. 定义观察者接口(Observer)

2. 定义被观察者接口(Subject)

3. 具体被观察者:天气站 WeatherData

4. 具体观察者:手机App、手表等

手机App 显示天气

手表显示天气

5. 测试类(Client)

6. 运行结果

五、总结:观察者模式的核心思想


 一、一句话理解观察者模式

当一个对象(被观察者)状态改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。

就像:
👉 你关注了一个微信公众号(订阅),
👉 当它发布新文章时,
👉 所有订阅的用户都会收到推送通知。

这就是典型的 观察者模式

 二、角色说明(三大角色)

角色 作用
Subject(主题 / 被观察者) 维护观察者列表,状态变化时通知所有人
Observer(观察者) 接收通知,执行自己的逻辑(如刷新、提醒)
Client(客户端) 创建对象,建立订阅关系

三、生活例子:天气站 + 手机App

假设有一个天气站(Subject),实时监测温度。
有多个 App(Observer)显示天气:

  • 手机天气 App
  • 智能手表天气 Widget
  • 网站天气板块

一旦温度变化,所有 App 自动更新。


四、Java 实现代码(标准观察者模式)

1. 定义观察者接口(Observer)

// 观察者接口

public interface Observer {

void update(float temperature);

}

 


2. 定义被观察者接口(Subject)

import java.util.List;

// 被观察者接口

public interface Subject {

void registerObserver(Observer o); // 添加观察者

void removeObserver(Observer o); // 删除观察者

void notifyObservers(); // 通知所有观察者

}

 


3. 具体被观察者:天气站 WeatherData

import java.util.ArrayList;
import java.util.List;

public class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;  // 温度

    public WeatherData() {
        this.observers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature);
        }
    }

    // 当温度变化时,调用此方法(内部自动通知所有App)
    public void setTemperature(float temperature) {
        this.temperature = temperature;
        System.out.println("【天气站】温度已更新为: " + temperature + "°C");
        notifyObservers();  // 通知所有观察者
    }
}

 


4. 具体观察者:手机App、手表等

手机App 显示天气

 

public class PhoneDisplay implements Observer {
    private float temperature;

    @Override
    public void update(float temperature) {
        this.temperature = temperature;
        display();
    }

    public void display() {
        System.out.println("📱 手机App:当前温度是 " + temperature + "°C");
    }
}

手表显示天气
public class WatchDisplay implements Observer {
    private float temperature;

    @Override
    public void update(float temperature) {
        this.temperature = temperature;
        display();
    }

    public void display() {
        System.out.println("⌚ 智能手表:气温 " + temperature + "°C");
    }
}

 


5. 测试类(Client)

public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建被观察者:天气站
        WeatherData weatherData = new WeatherData();

        // 创建观察者:两个App
        Observer phoneApp = new PhoneDisplay();
        Observer watchApp = new WatchDisplay();

        // 注册订阅关系
        weatherData.registerObserver(phoneApp);
        weatherData.registerObserver(watchApp);

        // 模拟温度变化 → 自动通知所有App
        weatherData.setTemperature(25.5f);
        System.out.println();

        weatherData.setTemperature(28.0f);
        System.out.println();

        // 取消手表订阅
        weatherData.removeObserver(watchApp);
        System.out.println("【智能手表取消订阅】");

        weatherData.setTemperature(30.2f);
    }
}

 


6. 运行结果


五、总结:观察者模式的核心思想

特点 说明
松耦合 被观察者不关心观察者具体是谁,只通知
动态订阅/取消 可随时添加或移除观察者
一对多通知 一个变化,多个响应
事件驱动 响应式编程的基础(如Spring事件、RxJava)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐