HeadFirst设计模式读书笔记--观察者模式(2)(二)
设计气象站(案例)
实现气象站
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)(二)相关推荐
- HeadFirst设计模式读书笔记
简单的做下笔记,以后找起来方便.设计原则通用,不针对哪个模式. 1 策略模式 定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 设计原则: 找出应用中可能需 ...
- 大话设计模式读书笔记
主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...
- JavaScript设计模式读书笔记(一)= 创建型设计模式
全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...
- JavaScript设计模式读书笔记(四)= 技巧型设计模式
全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...
- 设计模式读书笔记-----工厂方法模式
一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...
- Java读书笔记(4)-多线程(二)
Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...
- 《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)
Table of Contents 半虚拟化Virtio 132.Virtio使用场景 133.Virtio规范和原理 11.2.1 设备的配置 1. 设备的初始化 2. 设备的发现 3. 传统模式v ...
- 设计模式---读书笔记
一.文章来由 按照惯例,来一个来由,这是<设计模式-可复用面向对象软件的基础>的读书笔记,整理给自己看的,整理的内容也会不断更新.大神轻喷~~如果不喜欢请留言说明原因再踩哦,谢谢,我也可以 ...
- 设计模式读书笔记汇总
文章目录 一:简单工厂模式:代码无错就是优? 二:策略模式:出行(公交,打车...)(android中的动画) 三:装饰模式 ---->>>android源码中:Context和Co ...
最新文章
- 每周一荐: Google Dictionary,The Polar Express
- laravel mysql like_Laravel数据库查询中对 like 的值进行转义
- 详解python中的round()函数
- BOOST_TEST_LE和BOOST_TEST_LT的用法
- 回顾微软近年来对于Linux和开源的策略
- Eclipse相关快捷键
- android运行别人的项目_导入他人的Android工程
- Activity.startManagingCursor方法
- 分布式多级缓存中间件引导实践
- 阿里java高级面试题
- 社交聊天平台完整版源码【vue前端+后台+完整数据库+完整文档教程】
- Linux内核加载f2fs,安装f2fs工具以使用f2fs文件系统作为引导deepin系统分区
- 【数据结构】哈夫曼树及哈夫曼编码实现(C语言)
- 理解JESD204B链路参数 Understanding JESD204B Link Parameters
- Conjugate function and Fenchel’s duality theorem
- Android 微信双开
- App Store应用TOP榜:究竟有多少款App在使用Swift?
- Leetcode刷题笔记——剑指offer II (六)【图】
- 1GB等于多少MB?
- 简单几步,教你在服务器上实现量化交易(程序化交易)