观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。关于观察者,主题只需要知道观察者实现了某个接口。主题不需要知道观察者的具体类是谁,做了什么或者其他的什么细节,任何时候都可以添加新的观察者或者删除观察者。下面就以一个例子来实现观察者模式。首先新建一个主题、观察者以及显示的接口
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);
}

}

“`

设计模式之---观察者模式相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  2. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  3. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. 设计模式 C++观察者模式

    无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...

  6. 学习《图说设计模式》观察者模式

    图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...

  7. 设计模式之观察者模式——猫抓老鼠2

    设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...

  8. 设计模式之观察者模式——猫抓老鼠1

    设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...

  9. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  10. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

最新文章

  1. 谷歌扔下芯片核弹:开源全球首个可制造的PDK,免费帮有缘人实现造芯梦想
  2. 《Python核心编程》第二版第36页第二章练习 续一 -Python核心编程答案-自己做的-...
  3. RedHat5 开启telnet,ftp等服务
  4. VirtualBox 安装 Linux时 报错This kernel requires an X86-64 CPU,but only detected an i686 CPU错误的解决办法
  5. 行业看点 | 量子计算时代即将到来?华人科学家揭秘“天使粒子”背后故事……...
  6. python 智能造句_[零基础学Python]正规地说一句话
  7. Java异常统一处理
  8. java list实现九九乘法表梯形_JavaScript实现梯形乘法表的方法
  9. bzoj 3672 利用点分治将CDQ分治推广到树型结构上
  10. input或者button type=submit,设置disabled属性后,无法提交代码到后台
  11. 使用FlashBoot3.2c 将 U 盘制作成 DOS 启动盘
  12. brctl: command not found
  13. mysql中文版 win7_MySQL数据库下载64位下载-MySQL数据库64位【支持win7/win10】8.0.18 官方中文最新版-东坡下载...
  14. android 开门动画,Android之高仿微信“开门动画”(六)
  15. 20中氨基酸名称、简写及化学式
  16. html怎么画虚线空心圆,PS怎么画虚线圆圈 一个工具轻松搞定
  17. 智能园区中的身份识别的原理是什么?
  18. 值得珍藏!生生世世受用的译文 《心经》
  19. 基于52840 S340协议栈USB flash U盘实现
  20. 助眠好物推荐,改善睡眠的好方法

热门文章

  1. OS / Linux / pthread_cond_wait 为什么需要传递 mutex 参数?
  2. lnmp基于fastcgi实现nginx_php_mysql的分离_LNMP基于FastCGI实现Nginx,PHP,MySQL的架构分离...
  3. 计算机应用基础测试成绩截图,计算机应用基础测试题图文稿.docx
  4. busybox 安装mysql_安装busybox
  5. android 如何判断有没有网络
  6. 如何在有scoped不影响elementUI 的其他页面组件,进行单页面修改的几种方法。
  7. 记一次性能优化,限制tcp_timewait数量,快速回收和重用
  8. 知识储备—01-进程,线程,多线程相关总结
  9. [leetcode]@python 85. Maximal Rectangle
  10. [Objective-C] 020_ Block