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 { ...
随机推荐
- OSI模型级各层功能
OSI(Open System Interconnection 即 开放系统互联)国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架.OS ...
- windows linux 通过SSH X11Forwrding 使用图形化界面
有时候,我们需要在命令行中使用远程的GUI程序,这样我们就需要x11转发的来进行访问: Linux平台下不需要特别的配置,假如我们要远程的机器是centos机器,只要做如下配置即可: #vi /etc ...
- 用户和组的权限管理/特殊权限和ACL(个人笔记)
个人学习笔记总结 内容包括解释Linux的安全模型解释用户帐号和组群帐号的目的用户和组管理命令理解并设置文件权限默认权限特殊权限ACL介绍安全3A资源分派:Authentication:认证Auth ...
- appium---Android app资源监控
我们在做app测试的过程中,都会对app内存,cpu这些做一个简单的测试,今天简单的写下如何通过python监控app这些资源变化 实现原理 1.通过adb命令查看app资源内存 2.通过python ...
- 杂项记录 arm64 的一些特性
函数返回值:arm64 规定了整数型返回值放在 x0 寄存器里 sp(栈空间)字节对齐:该临时变量占用 4字节空间:又因为 arm64 下对于使用 sp 作为地址基址寻址的时候,必须要 16byte- ...
- Rust,重温猜猜看
其实,这个知识点蛮多的, 常看常新. use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Gu ...
- 批量执行用例,且结果显示在html中,python控制台也会显示运行过程
下载HTMLTestRunner.py放到python安装目录的Lib下: 如下以登录为例,创建不同的.py文件, ========================================== ...
- unittest,requests,assertEqual实战演练
请求方式:POST请求url:https://api.apiopen.top/developerLogin请求参数:名称 类型 必须 描述 示例name string 是 账号 peakchaopas ...
- Log日志级别从高到低排序 ERROR、WARN、INFO、DEBUG
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR.WARN.INFO.DEBUG.通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关.比如在这里定义了INFO级别,则应 ...
- sql语句优化的30种方法
转载于:https://www.cnblogs.com/Little-Li/p/8031295.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的 ...