知识,还是要实际应用才印象深刻。看了很多书,当时记忆和理解还不错,但时间久了总会忘记。像设计模式这个东西,单纯的看书,觉得挺简单,但实际编码时,往往无所适从,忘记了这些知识。知识还是得多复习、多巩固,然后多练,我个人属于看多写少的,惭愧。所以决定还是用博客的形式记录一下,也还能常回头翻翻。以前在网易写非技术性博客,新浪的博客倒是技术的,但是记录不系统、漫无目的,有点像做备忘录随记一样。
观察者模式角色:
主题、观察者
实现一个观察者模式的例子很简单。JDK已经实现了一套,可以直接复用。在java.util.Observable(主题接口)类中,实现了主要的功能,增加观察者、删除观察者、通知观察者,我们可以继承该类来使用这些功能,这里的子类的角色是“具体主题”。实现接口java.util.Observable(观察者接口),其方法update()在主题类中被回调,这里的实现者的角色是“具体观察者”。
public class Observable {
private boolean changed = false;
private Vector obs;
//创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。
public Observable() {
obs = new Vector();
}
/**
* 添加观察者到观察者列表中去
*/
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
/**
* 删除一个观察者
*/
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
/**
* 通知操作,即被观察者发生变化,通知对应的观察者进行事先设定的操作,不传参数的通知方法
*/
public void notifyObservers() {
notifyObservers(null);
}
/**
* 与上面的那个通知方法不同的是,这个方法接受一个参数,这个参数一直传到观察者里,以供观察者使用
*/
public void notifyObservers(Object arg) {
Object[] arrLocal;
synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
}
public interface Observer {
/**
* This method is called whenever the observed object is changed. An
* application calls an <tt>Observable</tt> object's
* <code>notifyObservers</code> method to have all the object's
* observers notified of the change.
*
* @param o the observable object.
* @param arg an argument passed to the <code>notifyObservers</code>
* method.
*/
void update(Observable o, Object arg);
}