天气预报项目需求,具体要求如下:
- 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。
- 需要设计开放型 API,便于其他第三方也能接入气象站获取数据。
- 提供温度、气压和湿度的接口
- 测量数据更新时,要能实时的通知给第三方
观察者模式原理
- 观察者模式类似订牛奶业务
- 奶站/气象局: Subject
- 用户/第三方网站: Observer
➢Subject: 登记注册、移除和通知
- registerObserver 注册
- removeObserver 移除
- notifyObservers() 通知所有的注册的用户,根据不同需求,可以是更新数据,让用户来取,也可能是实施推送, 看具体需求定
➢Observer: 接收输入
➢观察者模式: 对象之间多对一依赖的一种设计方案, 被依赖的对象为Subject,依赖的对象为Observer, Subject通知Observer变化,比如这里的奶站是Subject,是1的一方。用户时Observer,是多的一方。
观察者模式解决天气预报需求
类图说明
package com.xhl.Observer;
//观察者接口,由观察者来实现
public interface Observer {
public void update(float temperature,float perssure,float humidity);
}
package com.xhl.Observer;
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
package com.xhl.Observer;
public class BaiDuSite implements Observer{
private float temperatrue;
private float pressure;
private float humidity;
@Override
public void update(float temperature, float perssure, float humidity) {
// TODO Auto-generated method stub
this.humidity = humidity;
this.pressure = perssure;
this.temperatrue = temperature;
display();
}
public void display() {
System.out.println("========百度网站========");
System.out.println("**百度网站\t气温:"+temperatrue+"**");
System.out.println("**百度网站\t气压:"+pressure+"**");
System.out.println("**百度网站\t湿度:"+humidity+"**");
}
}
package com.xhl.Observer;
public class CurrentCondeitions implements Observer{
private float temperatrue;
private float pressure;
private float humidity;
@Override
public void update(float temperature, float perssure, float humidity) {
// TODO Auto-generated method stub
this.humidity = humidity;
this.pressure = perssure;
this.temperatrue = temperature;
display();
}
public void display() {
System.out.println("**Today\ttemperatrue:"+temperatrue+"**");
System.out.println("**Today\tpressure:"+pressure+"**");
System.out.println("**Today\thumidity:"+humidity+"**");
}
}
package com.xhl.Observer;
public class SinaSite implements Observer{
private float temperatrue;
private float pressure;
private float humidity;
@Override
public void update(float temperature, float perssure, float humidity) {
// TODO Auto-generated method stub
this.humidity = humidity;
this.pressure = perssure;
this.temperatrue = temperature;
display();
}
public void display() {
System.out.println("========新浪网站========");
System.out.println("**新浪网站\t气温:"+temperatrue+"**");
System.out.println("**新浪网站\t气压:"+pressure+"**");
System.out.println("**新浪网站\t湿度:"+humidity+"**");
}
}
package com.xhl.Observer;
import java.util.ArrayList;
/**
* 1.包含最新的天气情况信息
* 2.含有观察者集合,使用ArrayList管理
* 3.当数据有更新时,就主动的调用 ArrayList, 通知所有的(接入方)就看到最新的信息
*/
public class WeatherData implements Subject{
private float temperatrue;
private float pressure;
private float humidity;
//观察者集合
private ArrayList<Observer> observers;
public WeatherData() {
observers = new ArrayList();
}
public float getTemperatrue() {
return temperatrue;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void dataChange() {
// 调用接入方的update
notifyObserver();
}
// 当数据有更新时,就调用setDate
public void setDate(float temperature,float pressure,float humidity) {
this.humidity = humidity;
this.pressure = pressure;
this.temperatrue = temperature;
// 调用datachange,将最新信息推送给接入方 currentConditions
dataChange();
}
//注册一个观察者
@Override
public void registerObserver(Observer o) {
// TODO Auto-generated method stub
observers.add(o);
}
//移除一个观察者
@Override
public void removeObserver(Observer o) {
// TODO Auto-generated method stub
observers.remove(o);
}
//遍历所以的观察者,并通知
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for(Observer o : observers) {
o.update(this.temperatrue, this.pressure, this.humidity);
}
}
}
package com.xhl.Observer;
public class WeatherDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
WeatherData weatherData = new WeatherData();
CurrentCondeitions c = new CurrentCondeitions();
BaiDuSite b = new BaiDuSite();
weatherData.registerObserver(b);
weatherData.registerObserver(c);
System.out.println("通知各个注册的观察者查看信息");
weatherData.setDate(10f, 100f, 30.3f);
weatherData.registerObserver(new SinaSite());
weatherData.removeObserver(b);
System.out.println();
System.out.println("通知各个注册的观察者查看信息");
weatherData.setDate(9f, 80f, 35.3f);
}
}