设计模式学习笔记观察者模式
2015-08-08 13:25
363 查看
1、概念
它定义对象之间的许多依赖,象(主题对象)的状态改变时,它的全部依赖者(观察者对象)都会收到通知并自己主动更新。
2、优势
观察者模式实现了主题对象与观察者对象之间的松耦合,当有新的观察者时,无需改动主题对象的代码。仅仅须要新的观察者对象实现接口。在程序执行的过程中,能够随时注冊和删除观察者而不影响主体对象。
观察者模式使主题(Subject)对象和观察者(Observer)对象都能够被轻易地复用。
3、Java中观察者模式
Java API有内置的观察者模式,java.util包内包括最主要的Observer接口与Observable类
实现(源自head first)
主题对象
//observeable为Java自带的主题对象。自带
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
public WeatherData() { }
public void measurementsChanged() {
setChanged();
//notifyObservsers方法。假设
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;
}
}
//观察者对象
import java.util.Observable;
import java.util.Observer;
public class CurrentConditionsDisplay implements Observer {
Observable observable;
private float temperature;
private float humidity;
//初始化,建立一个观察者对象时,指明该对象的主题对象,并向该主题对象观察者队列中加入该对象
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData)obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}
它定义对象之间的许多依赖,象(主题对象)的状态改变时,它的全部依赖者(观察者对象)都会收到通知并自己主动更新。
2、优势
观察者模式实现了主题对象与观察者对象之间的松耦合,当有新的观察者时,无需改动主题对象的代码。仅仅须要新的观察者对象实现接口。在程序执行的过程中,能够随时注冊和删除观察者而不影响主体对象。
观察者模式使主题(Subject)对象和观察者(Observer)对象都能够被轻易地复用。
3、Java中观察者模式
Java API有内置的观察者模式,java.util包内包括最主要的Observer接口与Observable类
实现(源自head first)
主题对象
//observeable为Java自带的主题对象。自带
addObserver(Observer o),等方法[/code]deleteObserver(Observer o),hasChanged(),[code]notifyObservers(Object arg)
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
public WeatherData() { }
public void measurementsChanged() {
setChanged();
//notifyObservsers方法。假设
hasChanged方法指示对象已改变,则通知其全部观察者(调用观察者的update方法)
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;
}
}
//观察者对象
import java.util.Observable;
import java.util.Observer;
public class CurrentConditionsDisplay implements Observer {
Observable observable;
private float temperature;
private float humidity;
//初始化,建立一个观察者对象时,指明该对象的主题对象,并向该主题对象观察者队列中加入该对象
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData)obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}
相关文章推荐
- (四)理解HTTP消息头
- 利用log4j写日志
- (三) 理解HTTP消息头
- curl命令详解
- php绘图
- (二)理解HTTP消息头
- 强、弱、软、虚引用
- Genymotion模拟器连接Eclipse的总结[转]
- Codeforces567F. Mausoleum(DP)
- 虚拟机加载机制
- STM32F4xx -- Cortex M4
- EditText光标不显示
- win10如何安装python?win10安装python图文教程
- (一)初识HTTP消息头
- dfs寻路算法---迷宫问题实现
- Codeforces Round #245 (Div. 1)D(最近点对)
- poj 2828 Buy Tickets(动态队列·线段树单点更新)
- 综合简单聊天系统
- 方法分派
- [leedcode 224] Basic Calculator