前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-观察者模式

设计模式-观察者模式

作者头像
王小明_HIT
发布2020-11-11 16:47:13
4250
发布2020-11-11 16:47:13
举报
文章被收录于专栏:程序员奇点

设计模式-观察者模式

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

什么是观察者模式

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

观察者模式类图

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

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

代码

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

抽象主题(被观察者)

代码语言:javascript
复制
public interface Subject {
    void registerObserver(Observer o);

    void removeObserver(Observer o);

    void notifyObserver();
}

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

代码语言:javascript
复制
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);
        }
    }
}

抽象观察者

代码语言:javascript
复制
public interface Observer {
    void update(float temp, float humidity, float pressure);
}

抽象观察者实现

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
    }
}

测试方法

代码语言:javascript
复制
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 中有哪些类用了观察者模式

  • java.util.Observer
  • java.util.EventListener
  • javax.servlet.http.HttpSessionBindingListener
  • RxJava
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式-观察者模式
    • 什么是观察者模式
      • 观察者模式类图
        • 观察者设计模式包含哪些角色?
      • 代码
        • 抽象主题(被观察者)
        • 具体主题(被观察者)实现
        • 抽象观察者
        • 抽象观察者实现
        • 测试方法
      • Java 中有哪些类用了观察者模式
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档