设计模式-14-观察者模式
来源:互联网 发布:刘氏哈蜜椴树白蜜 知乎 编辑:程序博客网 时间:2024/05/24 04:37
观察者模式:观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。
被观察者接口
package com.actionPattern.observer.edition1;//被观察者接口public interface Subject { /** * 注册观察者 * @param observer */ public void registerObserver(Observer observer); /** * 删除观察者 * @param observer */ public void removeOberver(Observer observer); /** * 当主题状态发生改变时,这个方法需要被调用,以通知所有观察者 */ public void notifyObserver();}
实际被观察者(通过创建一个观察者集合,在被观察者发生改变时,遍历集合通知所有的观察者发生改变)
package com.actionPattern.observer.edition1;import java.util.ArrayList;import java.util.List;// 实际被观察者public class WeatherData implements Subject{ private List<Observer> observers;//观察者集合,实现一对多 private float tempterature;//温度 private float pressure;//压力 private float humidity;//湿度 public WeatherData(){ observers = new ArrayList<Observer>(); } //通过遍历集合通知所有的被观察者发生改变 @Override public void notifyObserver() { System.out.println("总共有观察者数:"+observers.size()+",所以有"+observers.size()+"个对象调用display方法"); for(int i = 0; i < observers.size();i++){ Observer observer = observers.get(i); observer.update(tempterature, humidity, pressure); } } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeOberver(Observer observer) { int i = observers.indexOf(observer); if(i >= 0){ observers.remove(i); } } /** * 气象站得到更新的观测数据时,通知观察者 */ public void measurementChanged(){ notifyObserver(); } public void setMeasurements(float temperature,float humidity,float pressure){ this.tempterature = temperature; this.humidity = humidity; this.pressure = pressure; measurementChanged(); }}
观察者接口
package com.actionPattern.observer.edition1;//观察者接口public interface Observer { public void update(float temp,float humidity,float pressure); public void display();}
实际观察者
package com.actionPattern.observer.edition1;//观察者public class CurrentConditionsDisplay implements Observer{ private float temperature; private float humidity; private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData){ this.weatherData = weatherData; weatherData.registerObserver(this); //注册观察者 } public void update(float temp, float humidity, float pressure) { this.temperature = temp; this.humidity = humidity; display(); } @Override public void display() { System.out.println("Current conditions:"+temperature+"F degrees and "+humidity+"% humidity"); }}
测试
package com.actionPattern.observer.edition1;public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); //一个被观察者(weatherData)对象对应多个观察者对象(conditionsDisplay,conditionsDisplay2) CurrentConditionsDisplay conditionsDisplay = new CurrentConditionsDisplay(weatherData); CurrentConditionsDisplay conditionsDisplay2 = new CurrentConditionsDisplay(weatherData); //当被观察者发生变化的时候,多个观察者相应的调用display()方法,发生相应的变化 weatherData.setMeasurements(80, 65, 30.4f); }}
阅读全文
0 0
- 设计模式:14 观察者模式
- 设计模式-14-观察者模式
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 1028. 人口普查(20)
- CentOS7 LVM添加硬盘及扩容
- 1029. 旧键盘(20)
- Ajax
- 1030. 完美数列(25)
- 设计模式-14-观察者模式
- Scrapy AttributeError: 'module' object has no attribute 'OP_NO_TLSv1_1 解决方法
- 88. Merge Sorted Array
- java对象的序列化与反序列化
- 反序打印参数
- 为什么中国的程序员总被称为码农?
- web前端学习日记5
- Python爬虫实战代码
- js css style动态设置table高度