案例
天气预报项目需求,具体要求如下:
1) 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如
发布到自己的网站或第三方)。
2) 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
3) 提供温度、气压和湿度的接口
4) 测量数据更新时,要能实时的通知给第三方
传统方案
或者
问题:
其他第三方接入气象站获取数据的问题
无人发在运行时动态加入
违反ocp
观察者模式
观察者模式累死订牛奶业务
奶站/气象站 Subject
用户/气象站 Observer
1) registerObserver 注册
2) removeObserver 移除
3) notifyObservers() 通知所有的注册的用户,根据不同需求,可以是更新数据,让用
户来取,也可能是实施推送,看具体需求定
public class Subject extends Observable {
private float temperature;
private float pressure;
private float humidity;
public void setData(float temperature,
float pressure,
float humidity){
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
setChanged();
notifyObservers(this);
}
@Override
public String toString() {
return "Subject{" +
"temperature=" + temperature +
", pressure=" + pressure +
", humidity=" + humidity +
'}';
}
}
public class CurrentCondition implements Observer {
private float temperature;
private float pressure;
private float humidity;
@Override
public void update(Observable o, Object arg) {
Subject subject = (Subject)arg;
System.out.println("change 1" + subject.toString());
}
}
public class Baidu implements Observer {
private float temperature;
private float pressure;
private float humidity;
@Override
public void update(Observable o, Object arg) {
Subject subject = (Subject)arg;
System.out.println("baidu 1" + subject.toString());
}
}
public static void main(String[] args) {
Subject subject = new Subject();
subject.addObserver(new CurrentCondition());
subject.addObserver(new Baidu());
subject.setData(1,2,3);
}