设计模式-观察者模式

问题背景

气象站每天会实时观察天气数据,然后将这些数据推送到企业,企业可以自行处理这些数据然后进行展示。

1)气象站可以将自己的数据公布出去
2)数据可能会经常更新,企业能实时收到数据
3)需要设计开放型API,便于其他第三方也能接入气象站获取数据。

观察者模式

观察者模式就是发送数据的一方维护一个观察者集合,想要接受数据的观察者就来订阅这个数据放,这样数据方就可以实时将数据推送到观察者。

1)这个观察者集合必须是动态维护的。

2)观察者必须实现统一的接口来让数据方实时调用同步数据

3)观察者模式是对象之间多对一的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。

解决方案

UML类图

在这里插入图片描述
1)Subject是被订阅方要实现的接口,它定义了动态维护观察者集合的方法
2)WeatherData是气象站,它实现Subject接口来作为被调用方,动态维护观察者的集合
3)Observer是观察者要实现的接口,定义了更新数据的接口
4)CurrentCondition是气象站自己展示数据的网站,Baidu、Sina是订阅气站站数据的企业

代码示例

public interface Subject {
    /**
     * 订阅
     *
     * @param observer
     */
    void registerObserver(Observer observer);

    /**
     * 取消订阅
     *
     * @param observer
     */
    void remove(Observer observer);

    /**
     * 发送消息
     */
    void notifyObservers();
}
public class WeatherData implements Subject{

    private double temperatrue;

    private double pressure;

    private double humidity;

    List<Observer> list = new ArrayList<>();

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

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

    /**
     * 设置信息
     *
     * @param temperatrue
     * @param pressure
     * @param humidity
     */
    public void set(double temperatrue, double pressure, double humidity) {
        this.temperatrue = temperatrue;
        this.pressure = pressure;
        this.humidity =humidity;
    }

    /**
     * 推送给企业
     *
     */
    @Override
    public void notifyObservers() {
        for (Observer observer : list) {
            observer.update(temperatrue, pressure, humidity);
        }
    }
}
public interface Observer {
    /**
     * 更新信息
     */
    void update(double temperatrue, double pressure, double humidity);
}
public class Baidu implements Observer{

    private double temperatrue;

    private double pressure;

    private double humidity;

    public void display(double temperatrue, double pressure, double humidity) {
        System.out.println("Baidu温度:" + temperatrue);
        System.out.println("Baidu湿度:" + pressure);
        System.out.println("Baidu气压:" + humidity);
    }

    @Override
    public void update(double temperatrue, double pressure, double humidity) {
        this.temperatrue = temperatrue;
        this.pressure = pressure;
        this.humidity = humidity;
        display(this.temperatrue, this.pressure, this.humidity);
    }
}
public class Sina implements Observer{

    private double temperatrue;

    private double pressure;

    private double humidity;

    public void display(double temperatrue, double pressure, double humidity) {
        System.out.println("sina温度:" + temperatrue);
        System.out.println("sina湿度:" + pressure);
        System.out.println("sina气压:" + humidity);
    }

    @Override
    public void update(double temperatrue, double pressure, double humidity) {
        this.temperatrue = temperatrue;
        this.pressure = pressure;
        this.humidity = humidity;
        display(this.temperatrue, this.pressure, this.humidity);
    }
}
public class Client {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();

        // Baidu订阅
        Baidu baidu = new Baidu();
        weatherData.registerObserver(baidu);
        weatherData.set(1.1,2.1,3.1);
        weatherData.notifyObservers();

        System.out.println("==================================");
        // Sina订阅
        Sina sina = new Sina();
        weatherData.registerObserver(sina);
        weatherData.set(11.1,22.1,33.1);
        weatherData.notifyObservers();

        System.out.println("==================================");
        // Baidu取消
        weatherData.remove(baidu);
        weatherData.set(111.1,222.1,333.1);
        weatherData.notifyObservers();
    }
}

观察者模式的好处

1)观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除和通知
2)这样,我们增加观察者,就不需要去修改核心类WeatherData的代码,遵守了OCP原则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值