HeadFirst设计模式---观察者
表达公式
注册者 + 订阅者 = 观察者模式
设计气象站

气象站接口
/**
** 布告板
** @author lollipop
** @since 2019/11/24
**/
public interface DisplayElement {
/** 显示 **/
void display();
}
/**
* 观察者
* @author lollipop
* @since 2019/11/24
*/
public interface Observer {
/**
* 更新
* @param temperature
* @param humidity
* @param pressure
*/
void update(float temperature,float humidity,float pressure);
}
/**
* 主题接口
* @author lollipop
* @since 2019/11/24
*/
public interface Subject {
/**
* 注册
*/
void registerObserver(Observer o);
/**
* 注销
*/
void removeObserver(Observer o);
/**
* 通知
*/
void notifyObserver();
}
气象实现
/**
* @author lollipop
* @since 2019/11/24
*/
@Data
public class CurrentConditionsDisplay implements Observer, DisplayElement {
/**
* 温度
*/
private float temperature;
/**
* 湿度
*/
private float humidity;
/**
* 天气数据
*/
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
/**
* 显示
*/
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
/**
* 更新
* @param temperature
* @param humidity
* @param pressure
*/
public void update(float temperature, float humidity, float pressure) {
this.humidity = humidity;
this.temperature = temperature;
display();
}
}
/**
* @author lollipop
* @since 2019/11/24
*/
public class ForecastDisplay implements Observer, DisplayElement {
private float temperature;
private float humidity;
private float pressure;
/**
* 天气数据
*/
private Subject weatherData;
/**
* 显示
*/
public void display() {
if (this.pressure < 10.0f) {
System.out.println("晴天");
} else if (this.pressure >= 10.0f && this.pressure < 50.0f) {
System.out.println("多云");
} else {
System.out.println("下雨");
}
}
public ForecastDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
/**
* 更新
*
* @param temperature
* @param humidity
* @param pressure
*/
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
this.display();
}
}
/**
* @author lollipop
* @since 2019/11/24
*/
public class StatisticsDisplay implements Observer, DisplayElement {
private float maxTemperatures = 0.00f;
private float minTemperatures = 0.00f;
private int count = 0;
private float totalTemperatures = 0.00f;
private float avgTemperatures = 0.00f;
/**
* 天气数据
*/
private Subject weatherData;
/**
* 显示
*/
public void display() {
System.out.println("maxTemperatures: " + maxTemperatures);
System.out.println("minTemperatures: " + minTemperatures);
System.out.println("avgTemperatures: " + avgTemperatures);
}
public StatisticsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
/**
* 更新
*
* @param temperature
* @param humidity
* @param pressure
*/
public void update(float temperature, float humidity, float pressure) {
if (this.maxTemperatures < temperature) {
this.maxTemperatures = temperature;
}
if (this.minTemperatures == 0.00f) {
this.minTemperatures = temperature;
} else if (this.minTemperatures > temperature) {
this.minTemperatures = temperature;
}
if (temperature > 0) {
totalTemperatures += temperature;
avgTemperatures = totalTemperatures / ++count;
}
this.display();
}
}
/**
* @author lollipop
* @since 2019/11/24
*/
@Data
public class WeatherData implements Subject {
/**
* 注入观察者
*/
List<Observer> observers = new ArrayList<Observer>(5);
/**
* 温度
*/
private float temperature;
/**
* 湿度
*/
private float humidity;
/**
* 气压
*/
private float pressure;
public WeatherData() {
}
/**
* 注册
*
* @param o
*/
public void registerObserver(Observer o) {
observers.add(o);
}
/**
* 注销
*
* @param o
*/
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(o);
}
}
/**
* 通知
*/
public void notifyObserver() {
for (Observer one : observers) {
one.update(temperature, humidity, pressure);
}
}
/**
* 通知观察者
*/
public void measurementsChanged() {
notifyObserver();
}
/**
* 设置数据
*
* @param temperature
* @param humidity
* @param pressure
*/
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
气象站运行
/**
* @author lollipop
* @since 2019/11/25
*/
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay conditionsDisplay = new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);
weatherData.setMeasurements(80,65,30.4f);
weatherData.setMeasurements(82,70,29.2f);
weatherData.setMeasurements(78,90,29.2f);
}
}
运行结果
Current conditions: 80.0F degrees and 65.0% humidity
maxTemperatures: 80.0
minTemperatures: 80.0
avgTemperatures: 80.0
多云
Current conditions: 82.0F degrees and 70.0% humidity
maxTemperatures: 82.0
minTemperatures: 80.0
avgTemperatures: 81.0
多云
Current conditions: 78.0F degrees and 90.0% humidity
maxTemperatures: 82.0
minTemperatures: 78.0
avgTemperatures: 80.0
多云
总结
- 需要List集合保存注册者
- 轮询注册者列表,动态调用注册者更新方法
HeadFirst设计模式---观察者的更多相关文章
- 《HeadFirst设计模式》读后感——对学习设计模式的一些想法
最近看完了<HeadFirst设计模式>,GOF的<设计模式——可复用面向对象软件的基础>的创建型模式也读完了,经历了从一无所知到茅塞顿开再到充满迷惑的过程. 不得不说< ...
- headfirst设计模式(2)—观察者模式
定义 观察者模式(有时又被称为发布(publish)-订阅(Subscribe)模式,在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]
1 2{<HeadFirst设计模式>之观察者模式 } 3{ 主题与观察者 } 4{ 编译工具 :Delphi7.0 ...
- 【Head-First设计模式】C#版-学习笔记-开篇及文章目录
原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...
- Headfirst设计模式的C++实现——策略模式(Strategy)
前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h #inclu ...
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式
先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...
- headfirst设计模式swift版01
headfirst设计模式这本书真好,准备用一个月学完.书里讲得很清楚了. 设计原则: 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是针 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...
随机推荐
- 记录console的使用
一般信息:console.info("这是info") 除错信息:console.debug() 警告提示:console.warn() 错误提示:console.error() ...
- Troubleshooting ORA-01555 - Snapshot Too Old: Rollback Segment Number "String" With Name "String" Too Small (Doc ID 1580790.1)
Troubleshooting ORA-01555 - Snapshot Too Old: Rollback Segment Number "String" With Name & ...
- Web服务器—Apache
Apache配置文件:httpd.conf文件 # 指定Apache的安装路径,此选项参数值在安装Apache时系统会自动把Apache的路径写入. ServerRoot "/www/ser ...
- python函数内容
在刚接触python的时候就有个疑问,什么是函数? python语言的函数和数学语言的函数有区别吗? 什么是函数 数学函数:给定一个数集A,假设其中的元素为x.现对A中的元素x施加对应法则f,记作f( ...
- vue+node+elementUI实现分页功能
第1===>收集当前页码 和 每页显示条数 第2==>发送ajax请求页码 和 每页显示条数发送给后端 第3===>接收后端返回的数据总条数 total 和 当前页码的数据 data ...
- java的加载与运行
jdk中有一个javac.exe(java编译器) *Java程序的运行包括两非常重要的阶段 -编译阶段 -运行阶段 *编译阶段 -主要任务是检查Java源程序是否符合Java语法 符合Java语法则 ...
- calcifications loss
import keras import tensorflow as tf from keras.models import Model from keras import backend as K # ...
- luoguP5227 [AHOI2013]连通图
题意 虽然没用线段树,但是仍然是线段树分治的思想. 考虑分治询问序列,假设当前在\([l,r]\),我们将\([1,l-1]\)和\([r+1,Q]\)的与\([l,r]\)内不重复的边都连上了. 先 ...
- 群体遗传之ped格式
1.PED简介 PED文件格式是广泛使用的用于连锁系谱数据分析的格式,并用作plink程序的输入.PLINK是一个免费的,开源的全基因组关联分析工集,旨在以高计算效率的方式执行一系列基本的,大规模的分 ...
- 【ECNU619】白网吧(差分)
点此看题面 大致题意: 给你\(n\)个区间,求最多有多少个区间重叠,以及平均每个点被多少个区间覆盖. 第一个询问 这个应该可以直接离散化+差分,即我们先把每个区间右端点加\(1\),然后对于一个离散 ...