设计模式学习--观察者模式(observer)

模式意图

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



代码
public static void main(String[] args){

	WeatherData weatherData = new WeatherDate(); //主题

	// 新建两个观察者
	// 观察者构造方法中 对观察者进行注册
	Observer1 ob1 = new Observer1(weatherData);	
	Observer2 ob2 = new Observer2(weatherData);	

	// 更新气象数据时,所有观察者都将会被通知
	weatherData.setMeasurements(80,65,30);
	weatherData.setMeasurements(90,70,35);

}
WeatherData:具体主题
public class WeatherData implements Subject
{
	// 设置温度
	public void setMeasurements(float temperature,float humidity ,float pressure){
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		// 通知所有观察者
		notifyObservers();
	}

	// 通知所有观察者
	public void notifyObservers(){
		for(){
			Observer observer = (Observer)observer.get(i);
			observer.update( temperature, humidity , pressure);
		}
	}
}
Observer1:具体观察者

public class Observer1 implements Observer
{
	// 注册观察者
	public Observer1(Subject weatherData){
		weatherData.registerObserver(this);
	}
	// 实现观察者接口的update()方法
	public void update(float temperature,float humidity ,float pressure){
		// 实现业务方法
		display( temperature, humidity , pressure)
	}

}


问题:

1 具体观察者一定要依赖主题吗?
不需要,subject注册观察者的代码可以移出Observer1,放到其它地方执行,从而去除观察者对主题的关系。
备注:《敏捷软件开发》P272中  图24.11的类图更是把主题和主题数据进行分离,理解起来更为清晰。
1.观察者关注只需要主题的数据,而非主题的业务对象。

推拉模式区别:

区别在于Observer接口参数
推:Observer接口参数为需要更新各个属性,拿气象数据例子来说参数可以使温度、湿度、压力等。
拉:Observer接口参数为主题对象(数据对象)即实现了Subject的实现类 WeatherData。
所以推荐在参数较少的情况下使用拉模式更加方便,但是当主题对象非常复杂参数很多,这样使用拉模式观察者获取数据时就更容易出错。




要点:

1、观察者模式定义了对象之间一对多的关系

2、主题用一个共同的接口来更新观察者

3、观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口

4、使用此模式时,你可从被观察者处推或拉数据

5、有多个观察者时,不可以依赖特定的通知次序

问题:

1 具体

你可能感兴趣的:(设计模式学习--观察者模式(observer))