设计模式之观察者模式(十四)-创新互联
目录
创新互联建站是一家从事企业网站建设、网站设计、做网站、行业门户网站建设、网页设计制作的专业网络公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点近千家。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元起,快前往官网查看详情吧
分享文章:设计模式之观察者模式(十四)-创新互联
文章URL:http://pwwzsj.com/article/djedeo.html