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 { ...
随机推荐
- Mysql双主加Keepalived+读写分离
一.MySQL于keepalived简介** 前言: 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要 ...
- luoguP4113 [HEOI2012]采花
经典颜色问题推荐博文 https://www.cnblogs.com/tyner/p/11519506.html https://www.cnblogs.com/tyner/p/11616770.ht ...
- html学习之二(常用标签练习)
<!DOCTYPE html><head> <meta charset="utf-8"> <title>锚点链接</title ...
- oracle 循环插入数据
参考链接:oracle 行转列 pivot函数基本用法 --建表 --drop table SalesList; create table SalesList( keHu varchar2(20), ...
- Python ord & chr
ord & chr ord: 返回单个 Unicode 字符编码的整数 chr: 给一个 Unicode 编码,返回一个字符 (0 ~ 1,114,111) (ASCII 与 Unicode ...
- C++ 数组遍历的两种方式
C++ 数组遍历的两种方式: #include <iostream> using namespace std; int main() { // 一维数组 ] = {, , , , }; / ...
- springcloud源码分析(一)之采用redis实现注册中心
注册中心 在分布式架构中注册中心起到了管理各种服务功能包括服务的注册.发现.熔断.负载.降级等功能,在分布式架构中起到了不可替代的作用.常见的注册中心有eureka,zookeeper等等,在spri ...
- 爬虫——控制台抓包和requests.post()发送请求
控制台抓包 打开方式及常用选项 1.打开浏览器,F12打开控制台,找到Network选项卡 2.控制台常用选项 1.Network: 抓取网络数据包 1.ALL: 抓取所有的网络数据包 2.XHR:抓 ...
- [2019BUAA软工助教]下半学期改进计划
[2019BUAA软工助教]下半学期改进计划 结合[2019BUAA软工助教]答黄衫同学,经过26日晚陈彦吉.刘畅.赵奕.李庆想四位助教的讨论,最终整理了以下这份计划 一.技术博客 各个团队在开发的过 ...
- 【测试方法】Web测试中bug定位基本方法
知识总结:Web测试中bug定位基本方法 涉及知识点:测试方法 在web测试过程中,经常会遇到页面中内容或数据显示错误,甚至不显示,第一反应就是BUG,没错,确实是BUG.进一步了解这个BUG的问题出 ...