设计气象站(案例)

实现气象站

public interface Subject{/**这两个方法都需要观察者作为变量,该观察者是用来注册或被删除的*/public void registerObserver(Observer o);public void removeObserver(Observer o);//当主题状态改变时,这个方法会被调用,以通知所有的观察者public void notifyObserver(Observer o);
}
//所有的观察者都必须实现update()方法,
//以实现观察者接口。
//在这里,我们按照Mar和Sue的想法把观测值传入观察者中
public interface Observer{public void update(float temp,float humidity,float pressure);//当气象观测值改变时,主题会把这些状态值当作方法的参数,传给观察者
}
//DisplayElement接口只包含了一个方法,也就是display()方法。
//当布告板需要显示时,调用此方法。
public interface DisplayElement(){public void display();
}

在WeatherData中实现主题接口

//WeatherData现在实现了Subject接口
public class WeatherData implements Subject{private ArrayList observers;//我们加上了一个ArrayList来记录观察者,此ArrayList是在构造器中建立的。private float temperature;private float humidity;private float pressure;public WeatherData(){observers = new ArrayList();}//当注册观察者时,我们只要把他们加到ArrayList的后面即可。public void registerObserver(Observer o){observers.add(o);}//同样地,当观察者想取消注册,我们把他从ArrayList中删除即可。public void removeObserver(Observer o){int i=observers.indexOf(o);if(i>=0){observers.remove(i);}}//在这里,我们把状态告诉每一个观察者。因为观察者都实现了update()方法,所以我们知道如何通知他们。public void notifyObservers(){for(int i=0;i<observers.size();i++){Observer observer = (Observer)observers.get(i);observer.update(teperature,humidity,pressure);}}//当从气象站得到更新观测值时,我们通知观察者。public void measurementsChanged(){notifyObservers();}public void setMeasurements(float temperature,float humidity,float pressure){this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}//WeatherData的其他方法
}

  现在,我们来建立布告板吧!

//此布告板实现了Observer接口,所以可以从WeatherData对象中获得改变
//它也实现了DisplayElement接口,因为我们的API规定所有的布告板都必须实现此接口
public class CurrentConditionsDisplay implements Observer,DisplayElement{private float temperature;private float humidity;private float Subject WeatherData;//构造器需要weatherData对象(也就是主题)作为注册之用public CurrentConditionsDisplay(Subject weatherData){this.weatherData = weatherData;weatherData.registerObserver(this);}//当update()被调用时,我们把温度和湿度保存起来,然后调用display()public void update(float temperature,float humidity,float pressure){this.temperature=temperature;this.humidity=humidity;display();}//display()方法就只是把最近的温度和湿度显示出来public void Display(){System.out.println("Current conditions:"+temperature+"F degrees and"+humidity+"% humidity");}
}

启动气象站

1.先建立一个测试程序

public class WeatherStation{public static void main(String[] args){//首先,建立一个WeatherData对象WeatherData weatherData = new WeatherData();//建立三个布告板,并把WeatherData对象传给它们CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);//模拟新的气象测量weatherData.setMeasurements(80,65,30.4f);weatherData.setMeasurements(82,70,29.2f);weatherData.setMeasurements(78,90,29.2f);}
}

2.运行程序,让观察者模式表演魔术

HeadFirst设计模式读书笔记--观察者模式(2)(二)相关推荐

  1. HeadFirst设计模式读书笔记

    简单的做下笔记,以后找起来方便.设计原则通用,不针对哪个模式. 1 策略模式 定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 设计原则: 找出应用中可能需 ...

  2. 大话设计模式读书笔记

    主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...

  3. JavaScript设计模式读书笔记(一)= 创建型设计模式

    全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...

  4. JavaScript设计模式读书笔记(四)= 技巧型设计模式

    全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...

  5. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  6. Java读书笔记(4)-多线程(二)

    Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...

  7. 《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)

    Table of Contents 半虚拟化Virtio 132.Virtio使用场景 133.Virtio规范和原理 11.2.1 设备的配置 1. 设备的初始化 2. 设备的发现 3. 传统模式v ...

  8. 设计模式---读书笔记

    一.文章来由 按照惯例,来一个来由,这是<设计模式-可复用面向对象软件的基础>的读书笔记,整理给自己看的,整理的内容也会不断更新.大神轻喷~~如果不喜欢请留言说明原因再踩哦,谢谢,我也可以 ...

  9. 设计模式读书笔记汇总

    文章目录 一:简单工厂模式:代码无错就是优? 二:策略模式:出行(公交,打车...)(android中的动画) 三:装饰模式 ---->>>android源码中:Context和Co ...

最新文章

  1. 每周一荐: Google Dictionary,The Polar Express
  2. laravel mysql like_Laravel数据库查询中对 like 的值进行转义
  3. 详解python中的round()函数
  4. BOOST_TEST_LE和BOOST_TEST_LT的用法
  5. 回顾微软近年来对于Linux和开源的策略
  6. Eclipse相关快捷键
  7. android运行别人的项目_导入他人的Android工程
  8. Activity.startManagingCursor方法
  9. 分布式多级缓存中间件引导实践
  10. 阿里java高级面试题
  11. 社交聊天平台完整版源码【vue前端+后台+完整数据库+完整文档教程】
  12. Linux内核加载f2fs,安装f2fs工具以使用f2fs文件系统作为引导deepin系统分区
  13. 【数据结构】哈夫曼树及哈夫曼编码实现(C语言)
  14. 理解JESD204B链路参数 Understanding JESD204B Link Parameters
  15. Conjugate function and Fenchel’s duality theorem
  16. Android 微信双开
  17. App Store应用TOP榜:究竟有多少款App在使用Swift?
  18. Leetcode刷题笔记——剑指offer II (六)【图】
  19. 1GB等于多少MB?
  20. 简单几步,教你在服务器上实现量化交易(程序化交易)

热门文章

  1. Android Studio更换眼睛保护背景色
  2. 计算异步FIFO的最小深度
  3. Java 中 10 大简单的性能优化
  4. KM算法解决二分图最大权分配问题
  5. NGINX-RTMP 直播服务部署
  6. 搭建AD域及加入域教程
  7. 985湖南大学苏州高等研究院在苏州相城经开区正式揭牌成立
  8. 微信公众号添加聊天机器人
  9. 从学习php到可以独立做网站需要多久,第一课 前言 学PHP就是为了做网站
  10. sketch(三)--插件