文章目录

  • 一、需求
  • 二、解决方案
    • 2.1 普通方案
    • 2.2 观察者模式

笔记来源: 尚硅谷

一、需求

天气预报项目需求,具体要求如下:

  1. 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如
    发布到自己的网站或第三方)。
  2. 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
  3. 提供温度、气压和湿度的接口
  4. 测量数据更新时,要能实时的通知给第三方

二、解决方案

2.1 普通方案

  1. 网站调用的气象站dataChange()

  2. 当数据定时更新时,气象站数据更新后,调用网站的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 观察者模式

观察者模式类似于订牛奶业务

  1. 奶站/气象局:Subject – 登记,注册,移除,通知
  2. 用户/第三方网站: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();}
}

调用时可以动态添加观察者,可维护性大大增强

尚硅谷设计模式-观察者模式相关推荐

  1. 尚硅谷设计模式笔记-装饰者模式

    文章目录 一.需求 二.装饰者方法 三.装饰者模式的JDK应用 笔记来源: 尚硅谷 一.需求 星巴克咖啡订单项目(咖啡馆) : 咖啡种类/单品咖啡: Espresso(意大利浓咖啡). ShortBl ...

  2. 尚硅谷设计模式笔记-适配器模式

    Table of Contents generated with DocToc 一.生活中的适配器 二.程序中的适配器模式 2.1 基本介绍 2.2 工作原理 三.类适配器模式 3.1 应用实例 3. ...

  3. 尚硅谷设计模式学习(1)---[设计模式七大原则]

  4. 尚硅谷设计模式学习(四)工厂模式

    从披萨店的案例引入工厂模式 披萨的种类很多(比如 GreekPizza.CheesePizza 等) 披萨制作完成后需要进行cut(切片工作),box(包装工作) 完成披萨店的功能 一.简单工厂模式 ...

  5. 尚硅谷设计模式学习(2)---[UML类图]

  6. Netty 上篇(尚硅谷)

    Netty 上篇(尚硅谷) 第 1 章 Netty 介绍和应用场景 1.1 本课程学习要求 1.2 Netty 的介绍 1.3 Netty 的应用场景 1.3.1互联网行业 1.3.2游戏行业 1.3 ...

  7. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  8. 尚硅谷 SpringCloud 第二季学习笔记【已完结】

    SpringCloud 一.介绍 (一)cloud和boot之间的依赖关系 https://spring.io/projects/spring-cloud#overview Finchley 是基于 ...

  9. 尚硅谷Java、HTML5前端、全栈式开发视频

    Java基础阶段: 一.20天横扫Java基础(课堂实录) https://pan.baidu.com/s/1htTzZRQ 二.尚硅谷Java基础实战--Bank项目 http://pan.baid ...

最新文章

  1. AI视觉在教育场景中的创新应用
  2. python 多个列表合并_Python对两个有序列表进行合并和排序的例子
  3. 配置nginx-rtmp流媒体服务器(宝塔面板配置教程)
  4. 2020年工业互联网行业研究报告(国盛证券)
  5. 带你了解两种线性规划的方法:稀疏矩阵存储和预处理
  6. mysql sdi_MySQL 8.0新特性: 数据字典
  7. 中控消费机一直显示连接服务器,中控消费机培训及常见问题的解决办法
  8. sublime text编辑器修改python代码的缩进设风格
  9. Docker容器 Cgroup资源分配(CPU和内存资源分配)
  10. JAVA TCP编程和UDP编程
  11. Spring框架中的aop操作之一 及aspectjweaver.jar与aopalliance-1.0.jar下载地址 包含beans 注解context 和aop的约束
  12. UE4-目录结构简介
  13. 64G的EXFAT格式的U盘如何格式化为FAT32
  14. 零基础入门C语言,只需2小时轻松学会!
  15. 工程内开启另一个exe文件
  16. 给老孙做了个排班表!
  17. 20200928 006.简单错误如何处理_守破离学习法_程序员修炼手册
  18. 2009年央视春晚最新节目单
  19. java小游戏-java小游戏-飞机大战
  20. nps服务器安装教程

热门文章

  1. docker 修改启动命令_Docker映射详解,没问题了!
  2. sql server与java实例_史上最全:PostgreSQL DBA常用SQL查询语句(建议收藏学习)
  3. python画三维图-Python 绘制酷炫的三维图步骤详解
  4. python123-python123练习题.doc
  5. python干嘛用的-学 Python 都用来干嘛的?
  6. python考试题目及答案-这就是你需要的python99道练习题(附答案)
  7. python自动化办公模块有哪些-python如何实现自动化办公?
  8. python是什么课程-教你python中什么是集合(一)
  9. php和python-PHP和Python如何选择?或许可以考虑这三个问题
  10. python新手小项目实例-有没有简单一点的 Python 小例子或小项目?