您的位置:首页 > 其它

设计模式心得:观察者模式 (observer pattern)

2015-01-26 09:19 459 查看
应用很好理解:一个subject,希望在更新的时候 (更新的定义可以从setChanged方法获得,例如,小于5的更新不通知,见下),自动通知一个observer list。 每个观察者收到更新后的动作与subject无关,大家可以自由加入/离开observer list。

java.util自带Observer, 类图 (来源Head First Design Patterns):



需要被观察的,顾名思义继承Observable类, Observable类自带Observer List以及添加删除等操作,不用重写。 需要通知时,call notifyObservers(). 但是注意,call前需要call setChanged(). setChanged()用来控制什么样的change算是需要通知Observer的change。

观察者在构造时加入Observer List, 并具体在update()方法里进行update的工作。 注意: update()有几种形式:

update(Observable obs, Object arg) : obs用来通知是哪个主题在通知update, arg则是这个主题推送的对象。

如果Observable notify是使用notifyObservers(),则意味着arg为null,使用的是pull的方法,观察者获得了整个obs

如果notify使用notifyObservers(Object obj), 则意味着Observable在push, 观察者可以使用arg。

Sample Observer code (Observable code is obvious):

class sampleObserver implements Observer {
Observable observable;
int var1;
sampleObserver(Observable _observable) {
observable = _observable;
observable.addObserver(this);
}
public void update(Observable obs, Object arg) {
//if it is push --> arg has something
//update with arg.getXXX
//if it is pull, use obs
UsefulData data = (UsefulData)obs;
var1 = data.getVar1();
}

public void display() {
//whatever way to display var1
}
}


使用内置Java library的坏处: 虽然Observer是接口,但是Observable是类,只能继承,影响继承其他东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式