设计模式--使用java内置的观察者模式(Observer Pattern)

观察者模式是对象的行为模式,顾名思义,即存在观察者和被观察者。 观察者模式可以让多个观察者同时监听同一个被观察对象,当被观察对象发生变化时,并通知所有观察者,使各个观察者能作出相应的响应。

在java中提供了Observerable类和Observer接口来实现观察者模式。

JAVA 内置的 Observer 类不是一个好的设计。首先,因为 Observable 是一个“类”,则必须设计一个类继承它,如果某类想同时具有 Observable 类和另一个超类的行为,就会陷入两难,这限制了Observale 的复用潜力。其次,Observable 将关键方法 setChange() 方法保护起来,这意味着:除非你继承自 Observable ,否则无法创建 Observable 实例并组合到自己的对象中来,这个设计违法了第二个设计原则:“多用组合,少用继承”。

 

1、被观察者继承observable

public class WeatherData extends Observable {

	private float temperature; //温度
	private float humidity; //湿度
	private float pressure; //气压

	public WeatherData() {}

	public void measurementsChanged() {
		setChanged();
		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;
	}

}

 2、观察者实现Observer接口

public class CurrentConditionsDisplay implements Observer, DisplayElement {

	private float temperature;
	private float humidity;
	private float pressure;
	private Observable observable;

	public CurrentConditionsDisplay(Observable observable) {
		this.observable = observable;
		this.observable.addObserver(this);
	}

	@Override
	public void display() {
		System.out.println("Current conditions:" + temperature
				+ "F degrees and " + humidity + "% humidity " + pressure
				+ " pressure");
	}

	@Override
	public void update(Observable obs, Object arg) {
		if(obs instanceof WeatherData){
			WeatherData weatherData = (WeatherData) obs;
			this.humidity = weatherData.getHumidity();
			this.temperature = weatherData.getTemperature();
			display();
		}
	}
}
 

3、测试类

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		WeatherData wd = new WeatherData();
		CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(wd);
		wd.setMeasurements(21, 13, 30.4f);
		wd.setMeasurements(1, 2, 3f);
	}

}

猜你喜欢

转载自liuxi1024.iteye.com/blog/584069