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