一,问题引入
天气预报项目需求
1.气象站可以将每天测量到的温度,湿度,气压等以公告的形式发布出去
2.需要设计开放型api,便于其他第三方,也能接入气象站获取数据
3.提供温度,气压和湿度的接口
4.测量数据更新时,要能实时的传给第三方
二,普通方案
WeatherData:天气数据
package 设计模式.观察者模式.普通方案;
//包含一个website对象,一旦数据有更改,就主动调用website对象的update
public class WeatherData {
private float temperature;
private float pressure;
private float humidity;
private Website date;
public WeatherData(Website date){
this.date=date;
}
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 void dataChange(){
date.update(getTemperature(),getPressure(),getHumidity());
}
public void setDate(float temperature,float pressure,float humidity){
this.temperature=temperature;
this.pressure=pressure;
this.humidity=humidity;
//推送最新的信息
dataChange();
}
}
Website:需要数据的第三方
package 设计模式.观察者模式.普通方案;
//显示当前天气情况
public class Website {
private float temperature;
private float pressure;
private float humidity;
//更新天气情况
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);
System.out.println("气压是"+pressure);
System.out.println("湿度是"+humidity);
}
}
Client:
package 设计模式.观察者模式.普通方案;
public class Client {
public static void main(String []args){
Website website=new Website();
WeatherData weatherData=new WeatherData(website);
weatherData.setDate(100,100,100);
weatherData.setDate(40,40,40);
}
}
四,使用观察者模式解决
Observer:观察者接口
package 设计模式.观察者模式.Improve;
public interface Observer {
public void update(float temperature,float pressure,float humidity);
}
CurrentCondition:具体观察者
package 设计模式.观察者模式.Improve;
public class CurentConditons 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);
System.out.println("气压:"+pressure);
System.out.println("湿度:"+humidity);
}
}
Subject:数据接口
package 设计模式.观察者模式.Improve;
public interface Sunject {
public void registObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
WeatherData:天气数据,使用一个数据集合存储具体观察者
package 设计模式.观察者模式.Improve;
import java.util.ArrayList;
import java.util.List;
public class WeatherData implements Sunject {
private float temperature;
private float pressure;
private float humidity;
List<Observer> list = new ArrayList<Observer>();
public void setDate(float temperature,float pressure,float humidity){
this.temperature=temperature;
this.pressure=pressure;
this.humidity=humidity;
notifyObservers();
}
//添加一个观察者
@Override
public void registObserver(Observer o) {
list.add(o);
}
//移除一个观察者
@Override
public void removeObserver(Observer o) {
if (list.contains(o))
list.remove(o);
}
//遍历所有观察者
@Override
public void notifyObservers(){
for(Observer i:list){
dateChange(i);
}
}
public void dateChange(Observer o){
o.update(temperature,pressure,humidity);
}
}
Client:使用
package 设计模式.观察者模式.Improve;
public class Client{
public static void main(String []args){
WeatherData weatherData=new WeatherData();
weatherData.registObserver(new CurentConditons());
weatherData.registObserver(new CurentConditons());
//
weatherData.setDate(100,100,100);
}
}