老僧长谈设计模式-4-观察者模式
来源:互联网 发布:亚像素边缘定位 算法 编辑:程序博客网 时间:2024/05/23 19:02
声明:
本节内容主要来自Head First
好吧,现在带你进入观察者模式的世界
【What】
观察者模式是什么?
观察者模式是JDK中使用最多的模式之一,非常有用。
观察者设计模式定义了对象间的一种一对多的依赖关系以及松耦合(没错是耦合),以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
有了观察者,你将会消息灵通。
类图
【How】
一个气象站的例子,这个例子超好的。
出版者 + 订阅者 = 观察者模式
这个图很棒,很生动!
观察者名言(好莱坞潜规则):
Subject: You don't call me, I will call you!
图:
这个图酷毙了~
松耦合的威力
当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
为什么呢?
关于观察者的一切,主题只知道观察者实现了某个接口(也就是Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其他任何细节。
任何时候我们都可以增加新的观察者,主题不会受到任何影响。有新的观察者出现时,主题代码不需要修改。
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。
设计气象站
实现气象站
/** * 主题 */ public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); }
/** * 观察者 */ public interface Observer { public void update(float temp, float humidity, float pressure); }
/** * 布告板 */ public interface DisplayElement { public void display(); }
在WeatherData中实现主题接口
public class WeatherData implements Subject { private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData() { observers = new ArrayList(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } /** *有趣的地方在这里 */ public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer)observers.get(i); observer.update(temperature, 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(); } public float getTemperature() { return temperature; } public float getHumidity() { return humidity; } public float getPressure() { return pressure; }}
启动测试
public static void main(String[] args) { //创建主题 WeatherData weatherData = new WeatherData(); //创建三个观察者 CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); HeatIndexDisplay heatIndexDisplay = new HeatIndexDisplay(weatherData); //进行气象测量,主题的状态会因为测量值而改变 weatherData.setMeasurements(80, 65, 30.4f); weatherData.setMeasurements(82, 70, 29.2f); weatherData.setMeasurements(78, 90, 29.2f); }
运行程序,让观察者模式表演魔术。
Java内置的观察者模式
java.util.Observer 接口
java.util.Observable 类
【Why】
为什么需要观察者模式?
【Q & A】
【结尾】
老规矩,上和尚镇楼
0 0
- 老僧长谈设计模式-4-观察者模式
- 老僧长谈设计模式-1-单例模式
- 老僧长谈设计模式-2-工厂模式
- 老僧长谈设计模式-3-策略模式
- 老僧长谈设计模式-5-装饰者模式
- 老僧长谈设计模式-6-状态模式
- 老僧长谈设计模式-7-代理模式
- 老僧长谈设计模式-8-命令模式
- 老僧长谈设计模式-9-责任链模式
- 老僧长谈设计模式-10-桥接模式
- 老僧长谈设计模式-11-原型模式
- 老僧长谈设计模式-7-代理模式2
- 老僧长谈设计模式-0-六大原则
- 设计模式(4): 观察者模式
- 【设计模式】## 4、观察者模式 ##
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 基于TestNG 与Selenium 的自动化测试设计与实施
- 智能硬件的时代划分
- 【shell】 if
- 【Android】Android获取系统联系人
- Error configuring application listener of class org.springframework.web.context.ContextLoaderListene
- 老僧长谈设计模式-4-观察者模式
- comparator接口与Comparable接口的区别
- servlet (1) 基础
- HDOJ 1034 Candy Sharing Game(模拟)
- 【项目基础】SSO理论篇
- 实现带参数的L脚本
- 集合---1
- poj1273 Drainage Ditches
- Android - Buttons