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

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

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


[img]http://dl.iteye.com/upload/attachment/0065/5746/ed702ed9-38ac-3258-89f6-2d7d2ed8d21a.gif[/img]

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

首先,定义一个可被观察的对象。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

每一个观察者都得到了及时更新数据。
在这个模式下,更新与否,以及更新的频率都交由被观察的对象决定。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值