1. 应用场景

某个实例的变化将影响其他多个对象。 观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。

2.概念

定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。主题(Subject)是被观察的对象,而其所有依赖者(Observer)称为观察者。

3. Class Diagram

主题(Subject)具有注册和移除观察者、并通知所有观察者的功能,主题是通过维护一张观察者列表来实现这些操作的。

观察者(Observer)的注册功能需要调用主题的 registerObserver() 方法。

4. Implementation

天气数据布告板会在天气信息发生改变时更新其内容,布告板有多个,并且在将来会继续增加。

public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObserver();
}public class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObserver();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {int i = observers.indexOf(o);if (i >= 0) {observers.remove(i);}}@Overridepublic void notifyObserver() {for (Observer o : observers) {o.update(temperature, humidity, pressure);}}
}public interface Observer {void update(float temp, float humidity, float pressure);
}public interface DisplayElement {public void display();
}public class StatisticsDisplay implements Observer, DisplayElement {private float maxTemp = 0.0f;private float minTemp = 200;private float tempSum= 0.0f;private int numReadings;private WeatherData weatherData;public StatisticsDisplay(WeatherData weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}public void update(float temp, float humidity, float pressure) {tempSum += temp;numReadings++;if (temp > maxTemp) {maxTemp = temp;}if (temp < minTemp) {minTemp = temp;}display();}public void display() {System.out.println("Avg/Max/Min temperature = " + (tempSum / numReadings)+ "/" + maxTemp + "/" + minTemp);}
}public class CurrentConditaionsDisplay implements Observer,DisplayElement {private WeatherData weatherData;private float temperature;private float humidity;public CurrentConditaionsDisplay(WeatherData weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void display() {System.out.println("temperature: "+temperature+" humidity: "+ humidity);}@Overridepublic void update(float temp, float humidity, float preesure) {this.humidity=humidity;this.temperature=temp;display();}
}public class ForecastDisplay implements Observer, DisplayElement {private float currentPressure = 29.92f;  private float lastPressure;private WeatherData weatherData;public ForecastDisplay(WeatherData weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}public void update(float temp, float humidity, float pressure) {lastPressure = currentPressure;currentPressure = pressure;display();}public void display() {System.out.print("Forecast: ");if (currentPressure > lastPressure) {System.out.println("Improving weather on the way!");} else if (currentPressure == lastPressure) {System.out.println("More of the same");} else if (currentPressure < lastPressure) {System.out.println("Watch out for cooler, rainy weather");}}
}public class WeatherStation {public static void main(String[] args) {WeatherData weatherData=new WeatherData();CurrentConditaionsDisplay conditaionsDisplay=new CurrentConditaionsDisplay(weatherData);StatisticsDisplay statisticsDisplay=new StatisticsDisplay(weatherData);ForecastDisplay forecastDisplay=new ForecastDisplay(weatherData);weatherData.setMeasurements(80,65,30.4f);weatherData.setMeasurements(82,75,35.4f);weatherData.setMeasurements(82,75,35.4f);}
}运行结果:temperature: 80.0 humidity: 65.0
Avg/Max/Min temperature = 80.0/80.0/80.0
Forecast: Improving weather on the way!
temperature: 82.0 humidity: 75.0
Avg/Max/Min temperature = 81.0/82.0/80.0
Forecast: Improving weather on the way!
temperature: 82.0 humidity: 75.0
Avg/Max/Min temperature = 81.333336/82.0/80.0
Forecast: More of the same

#5. JDK

  • java.util.Observer
  • java.util.EventListener
  • javax.servlet.http.HttpSessionBindingListener
  • RxJava

Java设计模式(二):观察者设计模式相关推荐

  1. Java中的观察者设计模式

    在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,该对象依赖于一个特定对象( 主体)的状态 . ...

  2. Java中的观察者设计模式-示例教程

    观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为S ...

  3. 观察者设计模式 Vs 事件委托(java)

    观察者设计模式 Vs 事件委托 标签: 设计模式 java 事件的委托 转载请注明原博客地址: http://blog.csdn.net/gdutxiaoxu/article/details/5182 ...

  4. java观察者设计模式_Java中的观察者设计模式

    java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...

  5. java 观察者模式示例_观察者设计模式示例

    java 观察者模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...

  6. java 观察者模式示例_Java中的观察者设计模式-示例教程

    java 观察者模式示例 观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ...

  7. Java EE重新审视设计模式:观察者

    除了以多种语言和许多应用程序实现之外,Observer Pattern自1.0版以来一直是Java的一部分. 观察者模式也是好莱坞原则的良好实施. 就像好莱坞的特工喜欢回调候选人以代替某个职位,而不是 ...

  8. java监听设计模式(java观察者设计模式)

    今天给大家分享一下观察者设计模式(监听设计模式),该模式在很多主流得框架.源码中使用率非常高.在分享之前先给大家讲一个我们使用手机的一个场景,我们都用过手机,当我们手机来电话的时候,会有各种复杂的操作 ...

  9. java设计模式 (二) 创建模式

    java设计模式 (二) 创建型模式 单例模式 Singleton pattern 现实场景 双11, 小华收快递, 早上圆通快递叫他下楼收快递, 刚上来, 顺丰快递叫他下楼收快递,.然后没多久EMS ...

  10. Java 设计模式归纳(观察者、工厂、单例、策略、适配器、命令、装饰者、外观、模板方法、状态

    DesignPattern 项目地址:youlookwhat/DesignPattern  简介: Java 设计模式归纳 (观察者.工厂.单例.策略.适配器.命令.装饰者.外观.模板方法.状态). ...

最新文章

  1. 精心安利8个良心好用的学习神器和办公神器
  2. Java 对比Vector、ArrayList、LinkedList
  3. unix查找的字符串包含特殊字符_python3从零学习-5.4.7、Unix风格路径名模式扩展glob...
  4. yii 使用 有赞sdk_有赞ABTest系统:数据驱动增长实践
  5. Lintcode: O(1) Check Power of 2
  6. 深度学习后时代,图灵奖得主Bengio研究核心是什么?
  7. SQL 必知必会·笔记7汇总数据——使用聚合函数
  8. javascript动画系列 —— 切换图片(原生)
  9. 卡函数or1200基于simple-spi的SD卡驱动
  10. Ubuntu 16.04虚拟环境virtualenv搭建
  11. Linux内核驱动目录功能说明
  12. MySQL总结4_多表查询
  13. 微信小程序做出 物流签收信息(步骤条) 源码
  14. python爬取电子病历_利用 BERT 模型解析电子病历
  15. Swagger3 版本动态分组
  16. Whai_springmvc笔记
  17. 嵌入式开发需要学习什么?
  18. 宝塔无法访问页面解决方法
  19. 算法导论——钢条切割问题(C语言)
  20. 阿里云ACE备考题库161-240

热门文章

  1. 想一下,最大公约数怎么求
  2. js实现元素水平垂直居中
  3. MySql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)...
  4. 转载--编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议60~64)
  5. oracle 内置函数(三)日期函数
  6. 防止论坛用户重复登录的方法 .
  7. 4循环队列的顺序表示中,为什么要空一个位置?
  8. C#委托的介绍(delegate、Action、Func、predicate)
  9. 机械工业出版社之道格·赫尔曼《Python 3标准库》目录
  10. C++用string 定义字符串数组