夜光序言:
少年有他的山海,有他的重重山影,有他的万里波涛。如果可以,风给他,沙漠给他,天空也给他。是无拘无束的风,会下大雨的沙漠,和铺满星辰的天空。万物给他,让他自由。
正文:
以道御术 / 以术识道
package 观察者模式.天气预报;
/*
*
* @title WeatherData
* @describe
* 这个类是核心
* 1.包含最新的天气情报
* 2.含有CurrentConditions对象
* 3.当数据有更新时,就主动调用CurrentConditions对象update方法(含有display)
* @author hy
* @version
* @date 2019/12/16
*
*/
public class WeatherData {
private float temperature;
private float pressure;
private float humidity;
private CurrentConditions currentConditions;
public WeatherData(CurrentConditions currentConditions) {
this.currentConditions = currentConditions;
}
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void dataChange(){
//调用接入方 的 update
currentConditions.update(getTemperature(),getPressure(),getHumidity());
}
public void setData(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
//夜光:调用dataChange,将最新的信息推送给接入方 currentConditions
dataChange();
}
}
package 观察者模式.天气预报;
/*
*
* @title CurrentConditions
* @describe 显示当前天气情况
* @author hy
* @version
* @date 2019/12/16
*
*/
public class CurrentConditions {
//几个参数,温度、气压、湿度
private float temperature;
private float pressure;
private float humidity;
//更新,是由weatherdata来调用,使用推送模式
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 观察者模式.天气预报;
/*
*
* @title Client
* @describe 这里我们写一个客户端
* @author hy
* @version
* @date 2019/12/16
*
*/
public class Client {
public static void main(String[] args) {
//创建接入方 currentConditions
CurrentConditions currentConditions = new CurrentConditions();
//创建 weatherData 并将接入方 currentConditions 传递到 weatherData中
WeatherData weatherData = new WeatherData(currentConditions);
//更新天气状况
weatherData.setData(30,150,40);
}
}
package 观察者模式.天气预报的改进模式;
public class CurrentConditions implements Observer{
//几个参数,温度、气压、湿度
private float temperature;
private float pressure;
private float humidity;
//更新,是由weatherdata来调用,使用推送模式
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 观察者模式.天气预报的改进模式;
//观察者接口,有观察者来实现
public interface Observer {
public void update(float temperature, float pressure, float humidity);
}
package 观察者模式.天气预报的改进模式;
//接口,需要让WeatherData来实现
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
package 观察者模式.天气预报的改进模式;
/*
*
* @title WeatherData
* @describe
* 这个类是核心
* 1.包含最新的天气情报
* 2.含有观察者集合,使用ArrayList集合
* 3.当数据有更新时,就主动调用ArrayList,通知所有的(接入方)就看到最新的信息
* @author hy
* @version
* @date 2019/12/16
*
*/
import java.util.ArrayList;
public class WeatherData implements Subject{
private float temperature;
private float pressure;
private float humidity;
//观察者集合
private ArrayList<Observer> observers;
//倘若有变化,那么需要加入新的第三方
public WeatherData() {
observers = new ArrayList<Observer>();
}
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void dataChange(){
//调用接入方 的 update
//currentConditions.update(getTemperature(),getPressure(),getHumidity());
notifyObservers(); //调用这个方法
}
public void setData(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
//夜光:调用dataChange,将最新的信息推送给接入方 currentConditions
dataChange();
}
//注册一个观察者
@Override
public void registerObserver(Observer o) {
//这里,我们如何增加进去
observers.add(o);
}
//移除一个观察者
@Override
public void removeObserver(Observer o) {
//首先呢,我们需要做一个判断
if(observers.contains(o)){
//这里,我们如何删除
observers.remove(o);
}
}
//遍历所有的观察者,并且通知
@Override
public void notifyObservers() {
for (int i=0;i<observers.size();i++){
//首先呢,取出来
observers.get(i).update(this.temperature,this.pressure,this.humidity);
}
}
}