1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者

按照上面的分析我们来进行设计

1.抽象主题Subject

  1. public interface Subject {
  2. public void registerObserver(Observer o);
  3. public void removeObserver(Observer o);
  4. public void notifyObservers();
  5. }

2.抽象观察者Obsever

  1. public interface Observer {
  2. public void update(float temp, float humidity, float pressure);
  3. }

3.具体主题WeatherData

  1. public class WeatherData implements Subject {
  2. private ArrayList observers;
  3. //temperature、humidity、pressure就是WeatherData的“状态”
  4. private float temperature;
  5. private float humidity;
  6. private float pressure;
  7.  
  8. public WeatherData() {
  9. observers = new ArrayList();
  10. }
  11.  
  12. public void registerObserver(Observer o) {
  13. observers.add(o);
  14. }
  15.  
  16. public void removeObserver(Observer o) {
  17. int i = observers.indexOf(o);
  18. if (i >= 0) {
  19. observers.remove(i);
  20. }
  21. }
  22.  
  23. public void notifyObservers() {
  24. for (int i = 0; i < observers.size(); i++) {
  25. Observer observer = (Observer)observers.get(i);
  26. observer.update(temperature, humidity, pressure);
  27. }
  28. }
  29.  
  30. public void measurementsChanged() {
  31. notifyObservers();
  32. }
  33.  
  34. public void setMeasurements(float temperature, float humidity, float pressure) {
  35. this.temperature = temperature;
  36. this.humidity = humidity;
  37. this.pressure = pressure;
  38. measurementsChanged();
  39. }
  40.  
  41. public float getTemperature() {
  42. return temperature;
  43. }
  44.  
  45. public float getHumidity() {
  46. return humidity;
  47. }
  48.  
  49. public float getPressure() {
  50. return pressure;
  51. }
  52. }

主题:相当的经典,第一具体的主题和多个观察者的集合,当自己的天气发送变化的时候,调用观察者的

  1. observer.update(temperature, humidity, pressure)通过观察者,观察者就能够通过
  1. update函数获得最新的天气变化
    具体的主题还必须提供一个接口,让观察者注册进来 registerObserver(Observer o)这个设计模式相当的经典

5.具体观察者

  1. public class StatisticsDisplay implements Observer, DisplayElement {
  2. private float maxTemp = 0.0f;
  3. private float minTemp = 200;
  4. private float tempSum= 0.0f;
  5. private int numReadings;//记录观测的次数以便计算平均温度值
  6. private Subject weatherData;
  7.  
  8. public StatisticsDisplay(Subject weatherData) {
  9. this.weatherData = weatherData;
  10. weatherData.registerObserver(this);
  11. }
  12. //这属于“推”数据,本类只使用到了第一个参数
  13. public void update(float temp, float humidity, float pressure) {
  14. tempSum += temp;
  15. numReadings++;
  16.  
  17. if (temp > maxTemp) {
  18. maxTemp = temp;
  19. }
  20.  
  21. if (temp < minTemp) {
  22. minTemp = temp;
  23. }
  24.  
  25. display();
  26. }
  27.  
  28. public void display() {
  29. System.out.println("Avg/Max/Min temperature = " + (tempSum / numReadings)
  30. + "/" + maxTemp + "/" + minTemp);
  31. }
  32. }

具体的观察者在收到最新的主题变化的信息之后,就可以依据最新的信息做自己想要做的事情,例如求气温的平均值等

  1.  

观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现的更多相关文章

  1. jQuery中的观察者模式(Observer Pattern)

    在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件, ...

  2. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  3. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  4. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  5. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  6. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  7. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  8. 使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event

    观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还 ...

  9. php观察者模式(observer pattern)

    ... <?php /* The observer pattern implements a one-too-many dependency between objects. The objec ...

随机推荐

  1. leetcode976之三角形最大周长

    题目描述: 给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. def largePara(A): A. ...

  2. 实验三 UML 建模工具的安装与使用

    UML 建模工具的安装与使用一. 实验目的1) 学习使用 EA(Enterprise Architect) 开发环境创建模型的一般方法: 2) 理解 EA 界面布局和元素操作的一般技巧: 3) 熟悉 ...

  3. jchdl - RTL实例 - Counter4

    https://mp.weixin.qq.com/s/xtvMj5f-Uvx3vesVnH0P_A   计数器.   参考链接 https://github.com/wjcdx/jchdl/blob/ ...

  4. c#tcp多线程服务器实例代码

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  5. 分布式事务专题笔记(一) 基础概念 与 CAP 理论

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.基础概念 1.什么是事务 什么是事务?举个生活中的例子:你去小卖铺买东西,“一手交钱,一手交货”就是 ...

  6. Java实现 LeetCode 371 两整数之和

    371. 两整数之和 不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a .b ​​​​​​​之和. 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: ...

  7. Java中StringBuffer和StringBuilder的区别

    区别1线程安全: StringBuffer是线程安全的,StringBuilder是线程是不安全的.因为StringBuffer的所有公开方法都用synchronized 来修饰,StringBuil ...

  8. java实现日程表

    [编程题] 某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息两天. 上级要求每个人每周的工作日和休息日必须是固定的,不能在周间变更. 此外,由于工作需要,还有如下要求: 1. 所有人的连 ...

  9. OpenJudge - 2977:生理周期

    原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天 ...

  10. test for OCr