设计模式-观察者模式

观察者模式就是一个对象在被调用或者初始化的时候,去触发其他对象的方法

每当发布天气预报时,会通知当地的居民,居民就是观察者(Observer),天气预报就是被观察者(Subject)

java 复制代码
/**
 * \观察者接口
 */
interface Observer {
    void update(WeatherData weatherData);
}
java 复制代码
/**
 * 具体的居民类(观察者类)
 */
class ConcreteResident implements Observer {
    private String name;

    public ConcreteResident(String name) {
        this.name = name;
    }

    public void update(WeatherData weatherData) {
        System.out.println(name + " 收到天气预报,温度:" + weatherData.getTemperature() + "℃,湿度:" + weatherData.getHumidity() + "%。");
    }
}

当被观察者发生变化时,会通知已添加在主体列表中的观察者

java 复制代码
/**
 * // 天气预报中心接口(主题接口)
 */
public interface WeatherCenter {
    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(WeatherData weatherData);
}
java 复制代码
import java.util.ArrayList;
import java.util.List;

/**
 * 具体的天气预报中心类
 */

class ConcreteWeatherCenter implements WeatherCenter {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers(WeatherData weatherData) {
        for (Observer observer : observers) {
            observer.update(weatherData);
        }
    }
}

测试实例

java 复制代码
public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建天气预报中心
        WeatherCenter weatherCenter = new ConcreteWeatherCenter();

        // 创建居民(观察者)
        Observer resident1 = new ConcreteResident("居民A");
        Observer resident2 = new ConcreteResident("居民B");

        // 注册观察者
        weatherCenter.addObserver(resident1);
        weatherCenter.addObserver(resident2);

        // 发布新的天气数据
        WeatherData weatherData = new WeatherData(25.0f, 60.0f);
        weatherCenter.notifyObservers(weatherData);

        // 输出:
        // 居民A 收到天气预报,温度:25.0℃,湿度:60.0%。
        // 居民B 收到天气预报,温度:25.0℃,湿度:60.0%。

        // 如果需要移除某个观察者,可以调用 removeObserver 方法
        // weatherCenter.removeObserver(resident1);
    }
}
相关推荐
渣渣_Maxz1 小时前
使用 antlr 打造 Android 动态逻辑判断能力
android·设计模式
码农颜4 小时前
java 设计模式_行为型_19命令模式
java·设计模式·命令模式
蔡蓝10 小时前
设计模式-迭代器模式
设计模式·迭代器模式
梦想画家10 小时前
数据管道架构设计指南:5大模式与最佳实践
设计模式·数据工程·数据编排
牛奶咖啡1321 小时前
学习设计模式《十三》——迭代器模式
设计模式·迭代器模式·内部迭代器和外部迭代器·带迭代策略的迭代器·双向迭代器·迭代器模式的优点·何时选用迭代器模式
哆啦A梦的口袋呀21 小时前
设计模式汇总
python·设计模式
在未来等你1 天前
设计模式精讲 Day 1:单例模式(Singleton Pattern)
java·设计模式·面向对象·软件架构
不会编程的小江江1 天前
【设计模式】单例模式
单例模式·设计模式
哆啦A梦的口袋呀1 天前
基于Python学习《Head First设计模式》第十一章 代理模式
学习·设计模式·代理模式
Dave_Young1 天前
上位机开发中的设计模式(3):装饰器模式
设计模式·装饰器模式