案例
天气预报项目需求,具体要求如下:
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);}@Overridepublic String toString() {return "Subject{" +"temperature=" + temperature +", pressure=" + pressure +", humidity=" + humidity +'}';}}
public class CurrentCondition implements Observer {private float temperature;private float pressure;private float humidity;@Overridepublic 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;@Overridepublic 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);}
