Head First Java设计模式——观察者模式

        观察者模式,书中的定义为“观察者模式定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新”。书中给出了一个气象站的实例,气象数据类的代码如下:

其中3个get方法分别获取温度、湿度、气压,而mentsChanged方法是一旦气象数据有更新就会被调用。正常的一般我们会有下面这个方法去调用,

	public class WeatherData {
		public void measurementsChanged() {
			float temp = getTemperature();
			float humidity = getHumidity();
			float pressure = getPressure();
			
			//下面就是3个布告板调用自己的更新函数
			currentConditionsDisplay.update(temp, humidity, pressure);
			statisticsDisplay.update(temp, humidity, pressure);
			forecastDisplay.update(temp, humidity, pressure);
		}
	}

但是直接调用布告板的更新函数,我们这里是针对实现编程,会导致我们以后在增加或删除布告板时必须修改程序。用观察者模式的来编程如下:

1、在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 notifyObserver(Observer o) {
			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();
		}
	}

 

2、建立布告板:

	public class CurrentConditionsDisplay implements Observer, DisplayElement {
		private float temperature;
		private float humidity;
		private Subject weatherData;
		
		public CurrentConditionsDisplay(Subject weatherData) {
			this.weatherData = weatherData;
			weatherData.registerObserver(this);
		}
		
		public void update(float temperature, float humidity, float pressure) {
			this.temperature = temperature;
			this.humidity = humidity;
			display();
		}
		
		public void display() {
			//这里执行显示
		}
	}


在观察者模式这一章中提到了两个设计原则:

1、找出程序中会变换的方面,然后将其和固定不变的方面相分离。

        在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。这就叫提前规划。

2、设计原则是针对接口编程,不针对具体实现编程。

        主题与观察者都使用接口:观察者利用主题的接口想主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运行正常,又同时具有松耦合的有点。

3、多用组合,少用继承。 

        观察者模式利用“组合”将许多观察者组合进主题中,对象之间的这种关系不是通过继承产生的。而是在运行时利用组合的方式而产生的。

 


 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值