1.传统方式
使用场景:
- 气象站每天会播报气温,湿度,气压等以公告。
- 设计API 第三方去获取气象站的信息。
- 提供 温度,湿度,气压等接口。
- 测量数据更新时,能实时的通知对放。
传统设计方案
- 通过对气象站项目的分析,设计出一个weatherData 类
如下图:- 1).通过getxxx 可以让第三方接入,并得到相应的信息。
- 2)当数据有更新时用dataChange() 来实时的更新数据,当第三方再次获取时,就能得到更新的数据。当然也可以推动。
currentCondtions (当天天气情况)可以理解为是我们气象局的网站//推送 如下类图: WeatherData 引用了 currentConditions 类
代码实现后续补充
缺点:
- 1 无法动态的添加气象的网站(启动后)
- 2 违反ocp原则,(在weatherData中,当增加一个第三方,都需要创建一个公告的模板,并加入到datachange,不利于维护,也不利于加入)
造成其他网站获取数据问题。
“”
public void dataChange() { currentConditions.update(getTemperature(), getPressure(), getHumidity()); }
2. 观察者模式
- 1.观察者模式类似定牛奶业务。
- 2.奶站/气象局 :subject。
- 3 用户第三方网站: observer 。
subject 登记注册,移除通知
observer 接收输入
观察者模式:对象之间多对一依赖的一种设计方案,被依赖对象为subject,依赖的对象Observer ,Subject 通知Observer变化 比如subject是一的一方。用户Observer 是多的一方。(事件触发机制)
2.1 观察者模式原理图
2.2 补充的类图:
- 显示属性和方法的类图,subject 类似 时间监听器,注册和删除相应事件,当有事件发生的时候,会广播的形式发给,observer 接口的实现类。
2.3 相应的代码
package design.observer;
/**
* @ClassName Subject
* @Description
* @Author
* @Date2022/1/7 22:28
* @Version V1.0
**/
public interface Subject {
/**
* 注册 第三方网站
* @param observer
*/
public void registerObserver (Observer observer);
/**
* 删除第三方网站
* @param observer
*/
public void removeObserver (Observer observer);
/**
* 通知 所有网站
*/
public void notifyAllObservers();
}
package design.observer;
/**
* @ClassName Observer
* @Description
* @Author
* @Date2022/1/7 22:24
* @Version V1.0
**/
public interface Observer {
/**
* .天气网站抽象的方法
* @param temperature
* @param pressure
* @param humidity
*/
void update (float temperature,float pressure, float humidity);
}
package design.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName WeatherData
* @Description
* @Author
* @Date2022/1/7 22:31
* @Version V1.0
**/
public class WeatherData implements Subject {
private float temperature;
private float pressure;
private float humidity;
private List<Observer> observerList ;
public WeatherData() {
observerList = new ArrayList<>();
}
public void setData(float temperature, float pressure, float humidity) {
this.humidity =temperature;
this.pressure=pressure;
this.humidity =humidity;
dataChanged();
}
@Override
public void registerObserver(Observer observer) {
this.observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(this.observerList.contains(observer)){
this.observerList.remove(observer);
}
}
/**
* 更新数据
*/
public void dataChanged(){
notifyAllObservers();
}
@Override
public void notifyAllObservers() {
//遍历更新多个模板
for(int i=0;i< this.observerList.size();i++){
observerList.get(i).update(this.temperature,this.pressure,this.humidity);
}
}
}
package design.observer;
/**
* @ClassName CurrentConditions
* @Description
* @Author
* @Date2022/1/7 23:26
* @Version V1.0
**/
public class CurrentConditions 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("temperature"+ temperature);
System.out.println("pressure"+ pressure);
System.out.println("humidity"+ humidity);
}
}
package design.observer;
/**
* @ClassName Client
* @Description
* @Author
* @Date2022/1/7 23:31
* @Version V1.0
**/
public class Client {
public static void main(String[] args) {
WeatherData weatherData= new WeatherData();
CurrentConditions currentConditions= new CurrentConditions();
weatherData.registerObserver(currentConditions);
weatherData.setData(10f,12f,13f);
}
}