尚硅谷设计模式学习(18)---[观察者模式( observer pattern)]

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷设计模式学习(18)---[观察者模式( observer pattern)]相关的知识,希望对你有一定的参考价值。

尚硅谷传送门==>B站尚硅谷Java设计模式

❤❤❤感谢尚硅谷❤❤❤

最近开始计划学习一下设计模式了,加油!!!



情景引入

天气预报项目需求:

  • 1 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(发布到自己的网站或第三方)
  • 2 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
  • 3 提供温度、气压和湿度的接口
  • 4 测量数据更新时,要能实时的通知给第三方

先试试用传统方案解决问题,

在得到数据后就更新到气象站CurrentConditions 的数据;然后 “显示”.

模拟气象站CurrentConditions

//当前状况,可理解为模拟气象站;
public class CurrentConditions {
    //温度;
    private float temperature;
    //湿度;
    private float humidity;
    //气压;
    private float pressure;

    //更新气象数据;
    public void update(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        display();
    }

    //显示气象数据;
    public void display() {
        System.out.println("今天的温度==>" + temperature);
        System.out.println("今天的湿度==>" + humidity);
        System.out.println("今天的气压指数==> " + pressure);
    }
}

气象数据WeatherData

//气象数据;
public class WeatherData {
    //温度;
    private float temperatrue;
    //湿度;
    private float humidity;
    //气压;
    private float pressure;
    
    //气象站;
    private CurrentConditions currentConditions;

    //初始化信息;
    public WeatherData(CurrentConditions currentConditions) {
        this.currentConditions = currentConditions;
    }

    //获取温度;
    public float getTemperature() {
        return temperatrue;
    }

    //获取湿度;
    public float getHumidity() {
        return humidity;
    }
    
    //获取气压;
    public float getPressure() {
        return pressure;
    }

    //数据更新;
    public void dataChange() {
        currentConditions.update(getTemperature(), getPressure(), getHumidity());
    }

    //设置传入数据;
    public void setData(float temperature, float pressure, float humidity) {
        this.temperatrue = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        //更新气象数据;
        dataChange();
    }
}

模拟客户端调用

public class Client {
    public static void main(String[] args) {
        //创建当前数据的对象;
        CurrentConditions currentConditions = new CurrentConditions();
        
        WeatherData weatherData = new WeatherData(currentConditions);
        weatherData.setData(25, 80, 30);
    }
}

得出

今天的温度==>25.0
今天的湿度==>30.0
今天的气压指数==> 80.0

需要注意的是;要是使用这样的方式;若增加一个显示气象的平台,就要在气象数据类WeatherData中增加属性,以及方法.


观察者模式

对象之间多对一依赖;被依赖的对象为(具体实行的方法),依赖的对象为用户(不同的),
以集合的方式来管理用户(Observer)

观察者接口Observer

//观察者;接口-->管理不同的用户;
public interface Observer {
    //更新天气数据;(温度,气压,湿度)
    public void update(float temperature, float humidity,float pressure);
}

不同的观察者;
气象平台ACurrentConditionA

//气象平台A
public class CurrentConditionA 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("------气象台A报道------");
        System.out.println("今天的温度==>" + temperature);
        System.out.println("今天的湿度==>" + humidity);
        System.out.println("今天的气压指数==> " + pressure);
    }
}

气象平台BCurrentConditionB

//气象平台B
public class CurrentConditionB 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("------气象台B报道------");
        System.out.println("今天的温度==>" + temperature);
        System.out.println("今天的湿度==>" + humidity);
        System.out.println("今天的气压指数==> " + pressure);
    }
}

定义平台的管理方法接口Subject

public interface Subject {
    //注册,增加;
    public void registerObserver(Observer observer);
    //移出;
    public void remove(Observer observer);
    //通知所有的注册的用户
    public void notifyObserver ( );
}

气象数据(核心类)WeatherData

public class WeatherData implements Subject {
    //温度;
    private float temperatrue;
    //湿度;
    private float humidity;
    //气压;
    private float pressure;

    //观察者(用户集合)
    private ArrayList<Observer> observerArrayList;

    //初始化信息;
    public WeatherData() {
        observerArrayList = new ArrayList<Observer>();
    }

    //获取温度;
    public float getTemperature() {
        return temperatrue;
    }

    //获取湿度;
    public float getHumidity() {
        return humidity;
    }

    //获取气压;
    public float getPressure() {
        return pressure;
    }

    //数据更新;
    public void dataChange() {
        notifyObserver();
    }

    //设置传入数据;
    public void setData(float temperature, float humidity, float pressure) {
        this.temperatrue = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        dataChange();
    }

    //注册;添加不同的气象台;
    @Override
    public void registerObserver(Observer observer) {
        observerArrayList.add(observer);
    }

    //移除气象台;
    @Override
    public void remove(Observer observer) {
        //若存在就移除;
        if(observerArrayList.contains(observer)){
            observerArrayList.remove(observer);
        }
    }

    //通知所有的气象台;
    @Override
    public void notifyObserver() {
        for (int i = 0; i < observerArrayList.size(); i++) {
            observerArrayList.get(i).update(getTemperature(),getHumidity(),getPressure());
        }
    }
}

模拟客户端Client

//模拟客户端;
public class Client {
    public static void main(String[] args) {
        //创建气象数据对象;
        WeatherData weatherData = new WeatherData();

        //创建平台A对象;
        //创建平台B对象;
        Observer currentConditionA = new CurrentConditionA();
        Observer currentConditionB = new CurrentConditionB();

        //添加发布的平台;
        weatherData.registerObserver(currentConditionA);
        weatherData.registerObserver(currentConditionB);
        //设置气象数据;
        weatherData.setData(31f,60f,180f);
    }
}

输出

------气象台A报道------
今天的温度==>31.0
今天的湿度==>60.0
今天的气压指数==> 180.0
------气象台B报道------
今天的温度==>31.0
今天的湿度==>60.0
今天的气压指数==> 180.0

使用这样的方式;让气象平台从原来的高耦合中隔离出来;若要添加新的平台,将创建的类对象添加即可;
而不是像之前那样直接在气象数据类WeatherData中去添加或更改.


在Jdk中用到的观察者模式

比如说;Observable类;它用来管理 观察者Observer

“观察者”Observer


以上是关于尚硅谷设计模式学习(18)---[观察者模式( observer pattern)]的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷设计模式学习---[装饰者模式]

尚硅谷设计模式学习---[单例模式]

尚硅谷设计模式学习---[桥接模式(Bridge)]

尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]

尚硅谷设计模式学习---[简单工厂模式,工厂方法模式,抽象工厂模式]

尚硅谷设计模式学习(17)---[迭代器模式(Iterator Pattern)]