设计模式之观察者模式(十四)-创新互联-成都快上网建站

设计模式之观察者模式(十四)-创新互联

目录

创新互联建站是一家从事企业网站建设、网站设计、做网站、行业门户网站建设、网页设计制作的专业网络公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点近千家。

1. 背景

1.1 天气预报项目

2. 观察者模式

2.1 观察者模式解决天气预报项目

2.2 观察者模式在JDK中应用


1. 背景 1.1 天气预报项目 天气预报项目需求 , 具体要求如下:
  • 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。
  • 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
  • 提供温度、气压和湿度的接口。
  • 测量数据更新时,要能实时的通知给第三方。

正常实现就是在气象站中聚合第三方,当数据发生变化是调用第三方的方法实现数据更新。

新增第三方时违反ocp原则, 不利于维护,也不能动态加入。

2. 观察者模式 2.1 观察者模式解决天气预报项目

其实可以没有Subject接口,主要的类就是WeatherData,里面聚合一个Observe的List,实现观察者注册,删除,通知等功能。

Observer:观察者接口。

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

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



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("***Today mTemperature: " + temperature + "***");
		System.out.println("***Today mPressure: " + pressure + "***");
		System.out.println("***Today mHumidity: " + humidity + "***");
	}
}



public class BaiDu implements Observer{

    // 温度,气压,湿度
    private float temperature;
    private float pressure;
    private float humidity;
    @Override
    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("===百度网站====");
        System.out.println("***百度网站 气温 : " + temperature + "***");
        System.out.println("***百度网站 气压: " + pressure + "***");
        System.out.println("***百度网站 湿度: " + humidity + "***");
    }
}

WeatherData

public class WeatherData {

    // 温度,气压,湿度
    private float temperature;
    private float pressure;
    private float humidity;
    //第三方集合
    private Listobservers;

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

    //当数据有更新时,就调用 setData
    public void setData(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        //调用dataChange, 将最新的信息 推送给 接入方 currentConditions
        notifyObservers();
    }

    //注册一个观察者
    public void registerObserve(Observer o) {
        observers.add(o);
    }

    //移除一个观察者
    public void removeObserve(Observer o) {
        observers.remove(o);
    }
    //遍历所有的观察者,并通知
    public void notifyObservers() {
        observers.forEach(a ->a.update(this.temperature, this.pressure, this.humidity));
    }

    public float getTemperature() {
        return temperature;
    }

    public void setTemperature(float temperature) {
        this.temperature = temperature;
    }

    public float getPressure() {
        return pressure;
    }

    public void setPressure(float pressure) {
        this.pressure = pressure;
    }

    public float getHumidity() {
        return humidity;
    }

    public void setHumidity(float humidity) {
        this.humidity = humidity;
    }

    public ListgetObservers() {
        return observers;
    }

    public void setObservers(Listobservers) {
        this.observers = observers;
    }
}

Client

public class Client {
    public static void main(String[] args) {

        WeatherData weatherData = new WeatherData();

        Observer baiDu = new BaiDu();
        CurrentConditions currentConditions = new CurrentConditions();

        weatherData.registerObserve(baiDu);
        weatherData.registerObserve(currentConditions);

        weatherData.setData(10f,20f,30f);

        System.out.println("=======================");

        weatherData.removeObserve(baiDu);
        weatherData.setData(100f,200f,300f);

    }
}
2.2 观察者模式在JDK中应用

JDK的 Observable类 就是JDK帮我们写好的一个观察者模式。

Observable:相当于Weather,已经帮我们写好了管理Observer的方法。

Observer:就是我们刚才写的接口。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:设计模式之观察者模式(十四)-创新互联
文章起源:http://kswjz.com/article/djedeo.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流