尚硅谷设计模式-观察者模式
文章目录
- 一、需求
- 二、解决方案
- 2.1 普通方案
- 2.2 观察者模式
笔记来源: 尚硅谷
一、需求
天气预报项目需求,具体要求如下:
- 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如
发布到自己的网站或第三方)。- 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
- 提供温度、气压和湿度的接口
- 测量数据更新时,要能实时的通知给第三方
二、解决方案
2.1 普通方案
网站调用的气象站dataChange()
当数据定时更新时,气象站数据更新后,调用网站的update(),推送到网站
//可以理解成气象站自己的网站 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("***Today mTemperature:" + temperature +"***");System.out.println("***Today mPressure: " + pressure + "***");System.out.println("***Today mHumidity: " + humidity + "***");} }
/*** 1.包含最新的天气信息* 2. 含有CurrentConditions对象* 3. 当数据更新时,主动调用update*/ public class WeatherData {private float temperatrue;private float pressure;private float humidity;private CurrentConditions currentConditions;public WeatherData (CurrentConditions currentConditions) {this.currentConditions = currentConditions ;}/*省略get set*/public void dataChange() {//调用网站update方法currentConditions.update(getTemperatrue(), getPressure(), getHumidity());}//当数据更新时调用setData,更新WeatherDatapublic void setData(float temperatrue, float pressure, float humidity){this.humidity = humidity;this.pressure = pressure;this.temperatrue = temperatrue;//推送最新数据给网站dataChange();}}
调用过程如下:
public class Client {public static void main(String[] args) {//创建接入方currentConditionsCurrentConditions currentConditions = new CurrentConditions();//创建WeatherData并将接入方currentConditions传递到WeatherData中WeatherData weatherData = new WeatherData(currentConditions);//更新天气情况weatherData.setData(30, 150, 40);} }
问题分析:
当添加多个第三方时,会修改WeatherData类中的大量方法,不利于维护,不能动态添加
2.2 观察者模式
观察者模式类似于订牛奶业务
- 奶站/气象局:Subject – 登记,注册,移除,通知
- 用户/第三方网站:Observer – 接受输入方,有更新方法
➢观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer, Subject通知Observer变化,比如这里的奶站Subject,是1的一方。用户时Observer,是多的一方。
public interface Subject {public void registerObserver (Observer o);public void remove0bserver (observer o);public void notifyObservers();
}
//观察者接口,由观察者实现
public interface Observer {public void update(float temperatrue, float pressure, float huminity );
}
//百度,实现观察者接口
public class Baidu implements Observer {private float temperature;private float pressure;private float humidity;public void display() {System.out.println("***Today mTemperature:" + temperature +"***");System.out.println("***Today mPressure: " + pressure + "***");System.out.println("***Today mHumidity: " + humidity + "***");}@Overridepublic void update(float temperature, float pressure, float humidity) {this.temperature = temperature;this.pressure = pressure;this.humidity = humidity;display();}
}
/*** 1.包含最新的天气信息* 2. 含有 观察者集合* 3. 当数据更新时,通知所有接入方,让他们看到最新消息*/
public class WeatherData implements Subject{private float temperature;private float pressure;private float humidity;private List<Observer> observers;public WeatherData () {this.observers = new ArrayList<Observer>();}/*省略get set*/@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void remove0bserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for(Observer observer : observers) {observer.update(temperature, pressure, humidity);} }public void setData(float temperatrue, float pressure, float humidity){this.humidity = humidity;this.pressure = pressure;this.temperature = temperatrue;notifyObservers();}
}
调用时可以动态添加观察者,可维护性大大增强
尚硅谷设计模式-观察者模式相关推荐
- 尚硅谷设计模式笔记-装饰者模式
文章目录 一.需求 二.装饰者方法 三.装饰者模式的JDK应用 笔记来源: 尚硅谷 一.需求 星巴克咖啡订单项目(咖啡馆) : 咖啡种类/单品咖啡: Espresso(意大利浓咖啡). ShortBl ...
- 尚硅谷设计模式笔记-适配器模式
Table of Contents generated with DocToc 一.生活中的适配器 二.程序中的适配器模式 2.1 基本介绍 2.2 工作原理 三.类适配器模式 3.1 应用实例 3. ...
- 尚硅谷设计模式学习(1)---[设计模式七大原则]
- 尚硅谷设计模式学习(四)工厂模式
从披萨店的案例引入工厂模式 披萨的种类很多(比如 GreekPizza.CheesePizza 等) 披萨制作完成后需要进行cut(切片工作),box(包装工作) 完成披萨店的功能 一.简单工厂模式 ...
- 尚硅谷设计模式学习(2)---[UML类图]
- Netty 上篇(尚硅谷)
Netty 上篇(尚硅谷) 第 1 章 Netty 介绍和应用场景 1.1 本课程学习要求 1.2 Netty 的介绍 1.3 Netty 的应用场景 1.3.1互联网行业 1.3.2游戏行业 1.3 ...
- Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年
Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...
- 尚硅谷 SpringCloud 第二季学习笔记【已完结】
SpringCloud 一.介绍 (一)cloud和boot之间的依赖关系 https://spring.io/projects/spring-cloud#overview Finchley 是基于 ...
- 尚硅谷Java、HTML5前端、全栈式开发视频
Java基础阶段: 一.20天横扫Java基础(课堂实录) https://pan.baidu.com/s/1htTzZRQ 二.尚硅谷Java基础实战--Bank项目 http://pan.baid ...
最新文章
- AI视觉在教育场景中的创新应用
- python 多个列表合并_Python对两个有序列表进行合并和排序的例子
- 配置nginx-rtmp流媒体服务器(宝塔面板配置教程)
- 2020年工业互联网行业研究报告(国盛证券)
- 带你了解两种线性规划的方法:稀疏矩阵存储和预处理
- mysql sdi_MySQL 8.0新特性: 数据字典
- 中控消费机一直显示连接服务器,中控消费机培训及常见问题的解决办法
- sublime text编辑器修改python代码的缩进设风格
- Docker容器 Cgroup资源分配(CPU和内存资源分配)
- JAVA TCP编程和UDP编程
- Spring框架中的aop操作之一 及aspectjweaver.jar与aopalliance-1.0.jar下载地址 包含beans 注解context 和aop的约束
- UE4-目录结构简介
- 64G的EXFAT格式的U盘如何格式化为FAT32
- 零基础入门C语言,只需2小时轻松学会!
- 工程内开启另一个exe文件
- 给老孙做了个排班表!
- 20200928 006.简单错误如何处理_守破离学习法_程序员修炼手册
- 2009年央视春晚最新节目单
- java小游戏-java小游戏-飞机大战
- nps服务器安装教程
热门文章
- docker 修改启动命令_Docker映射详解,没问题了!
- sql server与java实例_史上最全:PostgreSQL DBA常用SQL查询语句(建议收藏学习)
- python画三维图-Python 绘制酷炫的三维图步骤详解
- python123-python123练习题.doc
- python干嘛用的-学 Python 都用来干嘛的?
- python考试题目及答案-这就是你需要的python99道练习题(附答案)
- python自动化办公模块有哪些-python如何实现自动化办公?
- python是什么课程-教你python中什么是集合(一)
- php和python-PHP和Python如何选择?或许可以考虑这三个问题
- python新手小项目实例-有没有简单一点的 Python 小例子或小项目?