编程-设计模式 19:观察者模式

设计模式 19:观察者模式

定义与目的
  • 定义:观察者模式定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。
  • 目的:该模式的主要目的是允许一个对象(称为主体或被观察者)在状态发生变化时通知其他对象(称为观察者),从而实现对象之间的解耦。
实现示例

假设我们有一个天气预报系统,需要支持实时更新天气信息。我们可以使用观察者模式来实现这个需求。

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

// 主体接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体主体 - 天气数据
class WeatherData implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private float temperature;
    private float humidity;
    private float pressure;

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

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

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

    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObservers();
    }
}

// 具体观察者 - 当前条件显示器
class CurrentConditionsDisplay implements Observer {
    private float temperature;
    private float humidity;
    private float pressure;

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

    public void display() {
        System.out.println("Current conditions: " + temperature + " F degrees and " + humidity + "% humidity" + "pressure " + pressure );
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        Observer currentDisplay = new CurrentConditionsDisplay();

        weatherData.registerObserver(currentDisplay);

        weatherData.setMeasurements(80, 65, 30.4f);
        weatherData.setMeasurements(82, 70, 29.2f);
        weatherData.setMeasurements(78, 90, 29.2f);
        
		weatherData.removeObserver(currentDisplay);
    }
}
使用场景
  • 当一个对象(主体)的状态发生改变时,需要通知其他对象(观察者)时。
  • 当多个对象需要同时改变其状态,但是不知道彼此的存在时。
  • 当一个对象需要向其他对象提供其状态信息,但又不想让其他对象直接访问其内部状态时。

观察者模式通过定义对象间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这对于需要实现事件驱动或实时更新机制的场景非常有用。

小结

观察者模式是一种常用的行为型模式,它可以帮助你实现对象间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这对于需要实现事件驱动或实时更新机制的场景非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值