您的位置:首页 > 编程语言 > Java开发

java设计模式(二)—观察者模式

2015-11-23 23:42 429 查看
观察者模式:

1.概念:

定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

主题和观察者之间定义了一对多的关系。观察者依赖于此主题,只要主题状态一有变化,观察者就会被通知,并可能更新状态。

2.体现的设计原则:

(1)封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

(2)多用组合,少用继承。

(3)针对接口编程,不针对实现编程。

(4)为交互对象之间的松耦合设计而努力。

3.实现方式

3.1 实现类图



3.2 实现原理

(1) 一个主题对应多个观察者

(2) 依赖产生的原因:主题控制数据源,观察者依赖于主题,当主题变化时更新,这样比起让多份对象控制同一份数据,可以得到更干净的OO设计。

(3)松耦合:对象之间的依赖降到了最低。

1.主题只需知道观察者实现了某个接口(Observer)。不需关注观察者的其它细节。主题唯一依赖的东西是一个实现Observer接口的对象列表。

2.可以随时增加观察者,主题的代码不受影响

3.可以独立复用主题或观察者。

4.改变其它一方,并不影响另一方,因为二者松耦合,只需要接口被遵守。

3.3 实现示例

//被观察者
package observable;

import java.util.Observable;
import java.util.Observer;

public class WeatherData extends Observable  {
String temperature;
String humidity;
String pressure;

public WeatherData(){

}

public void setMeasurements(String temperature,String humidity,String pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}

private void measurementsChanged() {
setChanged();
notifyObservers();
}

public String getTemperature() {
return temperature;
}
public String getHumidity() {
return humidity;
}
public String getPressure() {
return pressure;
}

}

//布告板
package observer;

import java.util.Observable;
import java.util.Observer;
import observable.WeatherData;

public class CurrentConditionDisplay implements Observer {

WeatherData weatherData;
String temperature;
String humidity;

public CurrentConditionDisplay(){

}

public CurrentConditionDisplay(Observable observable){
this.weatherData = (WeatherData) observable;
weatherData.addObserver(this);
}

@Override
public void update(Observable obs, Object arg) {
if(obs instanceof WeatherData){
temperature = weatherData.getTemperature();
humidity =  weatherData.getHumidity();
display();
}
}
private void display() {
System.out.println("temperature:"+temperature + "humidity:"+humidity);
}
}

//测试类
package observer;

import observable.WeatherData;

public class WeatherStation {

public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData);
weatherData.setMeasurements("20", "30", "20");
}
}


4.观察者模式缺点

(1)可观察者是一个类而不是一个接口。一个类无法同时具有Obserable类和另一个超类的行为。限制了Obserable的复用潜力。

(2)Observable将关键方法保护起来。setChanged()方法被定义成protected。除非自己继承Observable,否则你无法创建Observable实例并组合到你自己的对象中来。

这个设计违反了“多用组合,少用继承”的原则。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: