设计模式之---观察者模式
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。关于观察者,主题只需要知道观察者实现了某个接口。主题不需要知道观察者的具体类是谁,做了什么或者其他的什么细节,任何时候都可以添加新的观察者或者删除观察者。下面就以一个例子来实现观察者模式。首先新建一个主题、观察者以及显示的接口
public interface Subject {public void registerObserver(Observe observe);public void removeObserver(Observe observe);public void notifyObserver();
}
public interface Observe {public void update(float temp,float humidity,float pressure);
}
public interface DisplayElement {public void display();
}
然后通过实现上述的接口实现一个数据源
public class WeatherData implements Subject {private ArrayList<Observe> observes;private float temperature;private float humidity;private float pressure;public WeatherData() {observes = new ArrayList<Observe>();}@Overridepublic void registerObserver(Observe observe) {observes.add(observe);}@Overridepublic void removeObserver(Observe observe) {if(observes.contains(observe)){observes.remove(observe);}}@Overridepublic void notifyObserver() {for (int i = 0; i < observes.size(); i++) {Observe observe = observes.get(i);observe.update(temperature, humidity, pressure);}}public void measurementChanged(){notifyObserver();}public void setMeasurements(float temperature, float humidity, float pressure){this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementChanged();}
}
数据源完成时候就是要展示数据,也就是实现观察者
public class CurrentConditionsDisplay implements Observe, DisplayElement {private float temperature;private float humidity;private Subject weatherData;public CurrentConditionsDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void display() {System.out.println("当前气温::"+temperature+"摄氏度,相对湿度为:"+humidity+"%");}@Overridepublic void update(float temp, float humidity, float pressure) {this.humidity = humidity;this.temperature = temp;display();}}
public class ForecastDisplay implements Observe,DisplayElement{private float temperature;private float humidity;private float pressure;private Subject weatherData;public ForecastDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void display() {System.out.println("天气不错,可以出去郊游!");}@Overridepublic void update(float temp, float humidity, float pressure) {this.temperature = temp;this.humidity = humidity;this.pressure = pressure;display();}}
public class StatisticsDisplay implements Observe,DisplayElement{private float temperature;private WeatherData weatherData;private List<Float> list;public StatisticsDisplay(WeatherData weatherData) {list = new ArrayList<Float>();this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void display() {// 排序Collections.sort(list);float temp = 0;for (int i = 0; i < list.size(); i++) {temp+=list.get(i);}int vagtemp = (int) (temp/list.size());System.out.println("气温最大值/平均值/最小值:"+list.get(list.size()-1)+"/"+vagtemp+"/"+list.get(0)+" 摄氏度");}@Overridepublic void update(float temp, float humidity, float pressure) {this.temperature = temp;list.add(temp);display();}}
上述三个观察者都是跟着weatherData获取数据
测试程序:
“`
public class WeatherTest {
public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay conditionsDisplay = new CurrentConditionsDisplay(weatherData);StatisticsDisplay display = new StatisticsDisplay(weatherData);ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);weatherData.setMeasurements(20, 75, 30.4f);weatherData.setMeasurements(32, 70, 29.4f);weatherData.setMeasurements(18, 90, 31.4f);
}
}
“`
设计模式之---观察者模式相关推荐
- 设计模式:观察者模式--Observer
一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...
- java 观察者模式_图解Java设计模式之观察者模式
图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...
- 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?
前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...
- java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解
Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...
- 设计模式 C++观察者模式
无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...
- 学习《图说设计模式》观察者模式
图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...
- 设计模式之观察者模式——猫抓老鼠2
设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...
- 设计模式之观察者模式——猫抓老鼠1
设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...
- 设计模式学习--观察者模式(Observer Pattern)
设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热! 下午15:28 设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...
- 「设计模式(二) - 观察者模式」
「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...
最新文章
- 谷歌扔下芯片核弹:开源全球首个可制造的PDK,免费帮有缘人实现造芯梦想
- 《Python核心编程》第二版第36页第二章练习 续一 -Python核心编程答案-自己做的-...
- RedHat5 开启telnet,ftp等服务
- VirtualBox 安装 Linux时 报错This kernel requires an X86-64 CPU,but only detected an i686 CPU错误的解决办法
- 行业看点 | 量子计算时代即将到来?华人科学家揭秘“天使粒子”背后故事……...
- python 智能造句_[零基础学Python]正规地说一句话
- Java异常统一处理
- java list实现九九乘法表梯形_JavaScript实现梯形乘法表的方法
- bzoj 3672 利用点分治将CDQ分治推广到树型结构上
- input或者button type=submit,设置disabled属性后,无法提交代码到后台
- 使用FlashBoot3.2c 将 U 盘制作成 DOS 启动盘
- brctl: command not found
- mysql中文版 win7_MySQL数据库下载64位下载-MySQL数据库64位【支持win7/win10】8.0.18 官方中文最新版-东坡下载...
- android 开门动画,Android之高仿微信“开门动画”(六)
- 20中氨基酸名称、简写及化学式
- html怎么画虚线空心圆,PS怎么画虚线圆圈 一个工具轻松搞定
- 智能园区中的身份识别的原理是什么?
- 值得珍藏!生生世世受用的译文 《心经》
- 基于52840 S340协议栈USB flash U盘实现
- 助眠好物推荐,改善睡眠的好方法
热门文章
- OS / Linux / pthread_cond_wait 为什么需要传递 mutex 参数?
- lnmp基于fastcgi实现nginx_php_mysql的分离_LNMP基于FastCGI实现Nginx,PHP,MySQL的架构分离...
- 计算机应用基础测试成绩截图,计算机应用基础测试题图文稿.docx
- busybox 安装mysql_安装busybox
- android 如何判断有没有网络
- 如何在有scoped不影响elementUI 的其他页面组件,进行单页面修改的几种方法。
- 记一次性能优化,限制tcp_timewait数量,快速回收和重用
- 知识储备—01-进程,线程,多线程相关总结
- [leetcode]@python 85. Maximal Rectangle
- [Objective-C] 020_ Block