设计模式-观察者模式

设计模式-观察者模式

在我们的程序中,可能需要在某些数据变化的时候,其他类做出一些响应。不能开一个线程,然后每隔一段时间去检查数据是否有变化。更希望的是当一些内数据变化时,主动推送变化。

什么是观察者模式

对象之间一对多依赖,当一个对象状态改变时,它的依赖都会收到通知并更新状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AgEAgLmy-1604546123793)(https://imgkr2.cn-bj.ufileos.com/05bce96a-aad5-466a-a6de-a9a2e98ac48b.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=SljnW0IQwkFMKoiP7uf%252FW4awv2g%253D&Expires=1604631720)]

观察者模式类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qHvG7jXz-1604546123799)(https://imgkr2.cn-bj.ufileos.com/58ebe01b-f034-4219-a013-28a957910e6d.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=kES4wD3qwFNejSM5GIZ1iK8IjD4%253D&Expires=1604631728)]

观察者设计模式包含哪些角色?

  • Subject: 抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存到一个集合中,每个主题都可以有任意数量的观察者,抽象主题提供接口,供增加和删除观察者。
  • ConCreteSubject:具体主题(具体被观察者), 该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生变化时,给注册过的观察者发生通知。
  • Observer: 抽象观察者,是观察者的抽象类,定义了一个更新接口,使得在收到主题更改通知时更新自己
  • ConCrereObserver:具体观察者,实现抽象观察者定义的更新接口。便于收到主题变更通知时更新自身状态。

代码

举个例子,天气数据布告版在天气发生变化时会更新其内容,布告版本(观察者)有多个。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vUesajy-1604546123802)(https://imgkr2.cn-bj.ufileos.com/c6d277aa-c852-4c7f-bc84-9be72457199f.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=fjPrur5yMlvDpWu%252BAp%252FrLQ%252FCGUY%253D&Expires=1604628235)]

抽象主题(被观察者)

public interface Subject {
    void registerObserver(Observer o);

    void removeObserver(Observer o);

    void notifyObserver();
}

具体主题(被观察者)实现

public class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    private float pressure;

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

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

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

    @Override
    public void removeObserver(Observer o) {
        int i = observers.indexOf(o);
        if (i >= 0) {
            observers.remove(i);
        }
    }

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

抽象观察者

public interface Observer {
    void update(float temp, float humidity, float pressure);
}

抽象观察者实现

public class StatisticsDisplay implements Observer {

    public StatisticsDisplay(Subject weatherData) {
        weatherData.reisterObserver(this);
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        System.out.println("StatisticsDisplay.update: " + temp + " " + humidity + " " + pressure);
    }
}

布告版2

public class CurrentConditionsDisplay implements Observer {

    public CurrentConditionsDisplay(Subject weatherData) {
        weatherData.registerObserver(this);
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        System.out.println("CurrentConditionsDisplay.update: " + temp + " " + humidity + " " + pressure);
    }
}

测试方法

public class WeatherStation {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
        StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);

        weatherData.setMeasurements(0, 0, 0);
        weatherData.setMeasurements(1, 1, 1);
    }
}

Java 中有哪些类用了观察者模式

欢迎关注公众号:程序员开发者社区

在这里插入图片描述

wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 19.89元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值