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

应用很好理解:一个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是类,只能继承,影响继承其他东西。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值