夜光带你走进 Java 成神之路(三十一)擅长的领域

夜光序言:

 

少年有他的山海,有他的重重山影,有他的万里波涛。如果可以,风给他,沙漠给他,天空也给他。是无拘无束的风,会下大雨的沙漠,和铺满星辰的天空。万物给他,让他自由。

 

正文:

                           以道御术 / 以术识道

package 观察者模式.天气预报;

/*
*
 * @title WeatherData
 * @describe
 * 这个类是核心
 * 1.包含最新的天气情报
 * 2.含有CurrentConditions对象
 * 3.当数据有更新时,就主动调用CurrentConditions对象update方法(含有display)
 * @author hy
 * @version
 * @date 2019/12/16
 *
 */


public class WeatherData {

    private float temperature;
    private float pressure;
    private float humidity;
    private CurrentConditions currentConditions;

    public WeatherData(CurrentConditions currentConditions) {
        this.currentConditions = currentConditions;
    }

    public float getTemperature() {
        return temperature;
    }

    public float getPressure() {
        return pressure;
    }

    public float getHumidity() {
        return humidity;
    }

    public void dataChange(){
        //调用接入方 的 update
        currentConditions.update(getTemperature(),getPressure(),getHumidity());
    }

    public void setData(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        //夜光:调用dataChange,将最新的信息推送给接入方  currentConditions
        dataChange();
    }


}
package 观察者模式.天气预报;

/*
*
 * @title CurrentConditions
 * @describe 显示当前天气情况
 * @author hy
 * @version
 * @date 2019/12/16
 *
 */

public class CurrentConditions {

    //几个参数,温度、气压、湿度
    private float temperature;
    private float pressure;
    private float humidity;

    //更新,是由weatherdata来调用,使用推送模式
    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:" +temperature);
        System.out.println("pressure:" +pressure);
        System.out.println("humidity:" +humidity);

    }

}
package 观察者模式.天气预报;

/*
*
 * @title Client
 * @describe 这里我们写一个客户端
 * @author hy
 * @version
 * @date 2019/12/16
 *
 */

public class Client {
    public static void main(String[] args) {
        //创建接入方  currentConditions
        CurrentConditions currentConditions = new CurrentConditions();
        //创建 weatherData 并将接入方  currentConditions 传递到 weatherData中
        WeatherData weatherData = new WeatherData(currentConditions);
        //更新天气状况
        weatherData.setData(30,150,40);

    }
}

package 观察者模式.天气预报的改进模式;

public class CurrentConditions implements Observer{

    //几个参数,温度、气压、湿度
    private float temperature;
    private float pressure;
    private float humidity;

    //更新,是由weatherdata来调用,使用推送模式
    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:" +temperature);
        System.out.println("pressure:" +pressure);
        System.out.println("humidity:" +humidity);

    }

}
package 观察者模式.天气预报的改进模式;

//观察者接口,有观察者来实现
public interface Observer {

    public void update(float temperature, float pressure, float humidity);

}
package 观察者模式.天气预报的改进模式;



//接口,需要让WeatherData来实现
public interface Subject {

    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();


}
package 观察者模式.天气预报的改进模式;

/*
*
 * @title WeatherData
 * @describe
 * 这个类是核心
 * 1.包含最新的天气情报
 * 2.含有观察者集合,使用ArrayList集合
 * 3.当数据有更新时,就主动调用ArrayList,通知所有的(接入方)就看到最新的信息
 * @author hy
 * @version
 * @date 2019/12/16
 *
 */



import java.util.ArrayList;

public class WeatherData implements Subject{

    private float temperature;
    private float pressure;
    private float humidity;

    //观察者集合
    private ArrayList<Observer> observers;


    //倘若有变化,那么需要加入新的第三方

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

    public float getTemperature() {
        return temperature;
    }

    public float getPressure() {
        return pressure;
    }

    public float getHumidity() {
        return humidity;
    }

    public void dataChange(){
        //调用接入方 的 update
        //currentConditions.update(getTemperature(),getPressure(),getHumidity());
        notifyObservers();   //调用这个方法
    }

    public void setData(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        //夜光:调用dataChange,将最新的信息推送给接入方  currentConditions
        dataChange();
    }

    //注册一个观察者
    @Override
    public void registerObserver(Observer o) {
        //这里,我们如何增加进去
        observers.add(o);
    }

    //移除一个观察者
    @Override
    public void removeObserver(Observer o) {
        //首先呢,我们需要做一个判断
        if(observers.contains(o)){
            //这里,我们如何删除
            observers.remove(o);
        }
    }

    //遍历所有的观察者,并且通知
    @Override
    public void notifyObservers() {
        for (int i=0;i<observers.size();i++){
            //首先呢,取出来
            observers.get(i).update(this.temperature,this.pressure,this.humidity);
        }
    }

}
发布了1477 篇原创文章 · 获赞 281 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/weixin_41987706/article/details/103523676