博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式笔记
阅读量:6766 次
发布时间:2019-06-26

本文共 4632 字,大约阅读时间需要 15 分钟。

  hot3.png

 

题目

气象局需要我们构建一套系统,这系统有两个公告牌,分别用于显示当前的实时天气和未来几天的天气预报。当气象局发布新的天气数据(WeatherData)后,两个公告牌上显示的天气数据必须实时更新。气象局同时要求我们保证程序拥有足够的可扩展性,因为后期随时可能要新增新的公告牌。

概况

这套系统中主要包括三个部分:气象站(获取天气数据的物理设备)、WeatherData(追踪来自气象站的数据,并更新公告牌)、公告牌(用于展示天气数据)

20173528_WaXC.png

WeatherData知道如何跟气象站联系,以获得天气数据。当天气数据有更新时,WeatherData会更新两个公告牌用于展示新的天气数据。

结构

172809_JUTZ_2887289.png

/** * 主题 * */public interface Subject {		/**	 * 注册观察者	 * */	void registerObserver(Observer obserber);	/**	 * 移除观察者	 **/	void removeObserber(Observer obserber );	/**	 * 通知	 * */	void notifyObserbers();
public class WeatherData implements Subject {	private List
obserbers; private float temperature; // 温度 private float pressure; // 气压 private List
forecastTemperatures; // 未来几天的温度 public WeatherData() { this.obserbers = new ArrayList
(); } @Override public void registerObserver(Observer obserber) { obserbers.add(obserber); } @Override public void removeObserber(Observer obserber) { obserbers.remove(obserber); } @Override public void notifyObserbers() { Iterator
iterator = obserbers.iterator(); while (iterator.hasNext()) { Observer observer = iterator.next(); observer.update(); } } public void measurementsChanged() { notifyObserbers(); } public void setMeasurements(float temperature, float pressure, List
forecastTemperatures) { this.temperature = temperature; this.pressure = pressure; this.forecastTemperatures = forecastTemperatures; measurementsChanged(); } public List
getObserbers() { return obserbers; } public void setObserbers(List
obserbers) { this.obserbers = obserbers; } 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 List
getForecastTemperatures() { return forecastTemperatures; } public void setForecastTemperatures(List
forecastTemperatures) { this.forecastTemperatures = forecastTemperatures; }}
/** * 观察者 * */public interface Observer {	/**	 * 更新	 * */	void update();}
/** * 公告牌 * */public interface DisplayElement {	/**	 *展示	 * */	public void display();	}
public class CurrentConditionsDisplay implements Observer , DisplayElement {	private WeatherData weatherData ;	private float temperature ; //湿度	private float pressure; // 气压			public CurrentConditionsDisplay (WeatherData weatherData ) {		this.weatherData = weatherData ; 		this.weatherData.registerObserver(this);	}		@Override	public void update() {		this.temperature = this.weatherData.getTemperature();		this.pressure = this.weatherData.getPressure();		display();	}	@Override	public void display() {		System.out.println("当前湿度:" + this.temperature );		System.out.println("当前气压:" + this.pressure );	}}
public class ForecastDisplay implements Observer, DisplayElement {	private WeatherData weatherData  ;	private List
forecastTemperatures ; public ForecastDisplay(WeatherData weatherData) { this.weatherData = weatherData ; this.weatherData.registerObserver(this); } @Override public void display() { System.out.println("未来几天气温:"); int count = forecastTemperatures.size() ; for(int i = 0 ; i < count ; i++) { System.out.println("第"+ i + "天,气温:" + forecastTemperatures.get(i) + "℃"); } } @Override public void update() { this.forecastTemperatures = weatherData.getForecastTemperatures() ; display(); }}

测试类

public class Test {	public static void main(String[] args) {		List
forecastTemperatures = new ArrayList<>(); forecastTemperatures.add((float) 28); forecastTemperatures.add((float) 32); forecastTemperatures.add((float) 30); WeatherData whatherData = new WeatherData(); whatherData.setTemperature(32); whatherData.setPressure(15); whatherData.setForecastTemperatures(forecastTemperatures); CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(whatherData); ForecastDisplay forecastDisplay = new ForecastDisplay(whatherData); System.out.println("-------whatherData初始化-------"); currentConditionsDisplay.update(); forecastDisplay.update(); System.out.println("-------whatherData数据更改-------"); forecastTemperatures.clear(); forecastTemperatures.add((float) 29); forecastTemperatures.add((float) 33); forecastTemperatures.add((float) 31); whatherData.setMeasurements(33, 16, forecastTemperatures); }}

运行结果:

-------whatherData初始化-------当前湿度:32.0当前气压:15.0未来几天气温:第0天,气温:28.0℃第1天,气温:32.0℃第2天,气温:30.0℃-------whatherData数据更改-------当前湿度:33.0当前气压:16.0未来几天气温:第0天,气温:29.0℃第1天,气温:33.0℃第2天,气温:31.0℃

 

转载于:https://my.oschina.net/higuy/blog/1540655

你可能感兴趣的文章
Vue.js入门教程-methods
查看>>
使用vue写的计算器demo
查看>>
Nginx负载均衡器处理Session共享的几种方法(转)
查看>>
按量付费转包年包月之批量操作篇
查看>>
研究人员用 AI 评估小血管病变,可预测病人患中风和痴呆的概率
查看>>
HeRM's :一个命令行食谱管理器
查看>>
这是一篇“干货”,老司机教你VR体验的正确姿势
查看>>
hdu cup
查看>>
Android:No implementation found for native(转)
查看>>
thinkphp-field
查看>>
“造城”or “造车”,哪个才是人工智能皇冠上的明珠?
查看>>
HBase 系统架构
查看>>
windows live writer Snipped Image Plugin on X64 system
查看>>
rocketmq3.5.8 原理和集群安装
查看>>
AIDE 学习笔记
查看>>
MSSql技巧之快速得到表的记录总数
查看>>
Office 2010 新特性 (一) 全局特性(1)
查看>>
Windows Phone 实用开发技巧(13):自定义Element Binding
查看>>
Puppet filebucket命令参数介绍(九)
查看>>
Hello World
查看>>