`
airu
  • 浏览: 267517 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

每天一个(设计模式)-- Observer模式(Publish/Subscribe模式)

 
阅读更多
今天这个模式,也是面试的时候问到的。其实这个模式最好理解。
观察者,与被观察的物体,订阅者,与被订阅(发布)者。

着这个模式下,我们实现了一对多的一个机制,并且可以针对对感兴趣的事情做订阅,或者观察,一旦有内容就自动通知。生活中这样的例子太多。在java中,也自带这个模式。我们还是先看看这个模式的UML:





一个订阅,一个发布,实际上很清晰明了。现在举个例子吧。天气预报吧。
每天都有气象局发布天气预报,而我们总不能天天打电话问吧,那就好好订阅一个天气服务吧,他会自动给你报。

首先,定义一个可被观察的对象。Oberservable,天气是可以被观察的吧。
public interface WeatherServiceInterface {
	public void subscribeWeatherService(Observer obs);
	public void unsubscribeWeatherService(Observer obs);
	public void notifyObserver(Object obj);
}

这个类名字长了点。不过方便我们读懂。呵呵。这个接口,提供给可以被订阅的天气。
现在实现一个可以报告温度的天气吧。

public class WeatherServiceImpl implements WeatherServiceInterface {

	public List<Observer> observers;
	public float temprature;
	
	public float getTemprature() {
		return temprature;
	}
	public void setTemprature(float temprature) {
		if(this.temprature != temprature){
			this.temprature = temprature;
			this.notifyObserver(this);
		}
		
	}
	public WeatherServiceImpl(){
		this.observers = new ArrayList<Observer>();
	}
	@Override
	public void subscribeWeatherService(Observer obs) {
		// TODO Auto-generated method stub
		observers.add(obs);
	}

	@Override
	public void unsubscribeWeatherService(Observer obs) {
		// TODO Auto-generated method stub
		observers.remove(obs);
	}

	@Override
	public void notifyObserver(Object obj) {
		// TODO Auto-generated method stub
		for(Observer obs:observers){
			obs.update(obj);
		}
	}
	
}


非常的清晰。根据接口,我们的实现也非常简洁。在设置温度的时候,如果温度发生了改变,将通知所有注册的观察者。

现在我们来看看观察者:
public interface Observer {
	public void update(Object obj);
}

一个观察者,需要提供一个接口,让被观察者调用。实现更新。
现在我们有个数据模型,需要根据温度改变而改变他的数据。

public class WeatherModel implements Observer{

	public String name;
	public float temprature;
	public WeatherModel(String name){
		this.name = name;
	}
	@Override
	public void update(Object obj) {
		// TODO Auto-generated method stub
		temprature =((WeatherServiceImpl)obj).getTemprature();
		System.out.println(name + " update temprature to : "+ temprature);
	}

}

这里加入一个name,以便区分不同的订阅者。测试一下:
public class Test {
	public static void main(String [] args){
		WeatherServiceImpl wsi = new WeatherServiceImpl();
		Observer obs1 = new WeatherModel("lily");
		Observer obs2 = new WeatherModel("lucy");
		wsi.subscribeWeatherService(obs1);
		wsi.subscribeWeatherService(obs2);
		
		wsi.setTemprature(20F);
		try{
		Thread.sleep(2);
		}catch(InterruptedException e){}
		wsi.setTemprature(22.30F);
	}
}

结果:

lily update temprature to : 20.0
lucy update temprature to : 20.0
lily update temprature to : 22.3
lucy update temprature to : 22.3

每一个观察者都得到了及时更新数据。
在这个模式下,更新与否,以及更新的频率都交由被观察的对象决定。
  • 大小: 5.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics