观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。关于观察者,主题只需要知道观察者实现了某个接口。主题不需要知道观察者的具体类是谁,做了什么或者其他的什么细节,任何时候都可以添加新的观察者或者删除观察者。下面就以一个例子来实现观察者模式。首先新建一个主题、观察者以及显示的接口
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. 【硅谷牛仔】DropBox CEO --德鲁休斯敦--找到合适自己的圈子,追逐自己感兴趣的事...
  2. Educational Codeforces Round 94 (Rated for Div. 2) D(思维)
  3. 前后端敏感数据加密方案及实现_01
  4. C#类的一些简单比较
  5. HyperLogLog浅析
  6. Qcom 平台 camera 之 RAW+YUV图抓取
  7. 5个最佳的Android测试框架(带示例)
  8. 计算机网络提供信息传输服务,计算机网络通常被划分为通信子网和资源子网,通信子网提供信息传输服务,资源子网提供共享资源。...
  9. wps目录怎么加一条_WPS中如何正确插入目录_WPS怎么做目录
  10. 一张专家推荐的最健康的作息时间表
  11. 【过分】Python监控小姐姐/小哥哥微博,了解一下??
  12. 面朝大海,春暖花开,有wifi
  13. Microsoft Project 2010 设置子任务
  14. 关于for循环中三个语句的执行顺序
  15. 麻将胡牌算法带癞子 python实现
  16. VIT ④function 、Object-oriented programming in Python
  17. 自学Python第五天。Python 三大器
  18. mac apache加载php,Apache 2.4没有加载php5.5与Mac OS 10.8
  19. console.log 打印与预期结果不同
  20. Matlab实现乘幂法

热门文章

  1. Ubuntu下安装依赖包问题总结
  2. Linux信号列表(非实时信号和实时信号)
  3. 方向梯度直方图(Histogram Of Gradient)详解
  4. Bootloader详解
  5. postman 设置请求编码_Postman使用
  6. python 依据某几列累加求和_如何用Python找出OBV金叉的股票?
  7. 杂谈:项目管理的是与非[转贴]
  8. Quartz.Net实现作业定时调度详解
  9. stm32L0工程建立(HAL+IAR,无cubemx)
  10. 【图论】Tarjan 缩点