一、好莱坞法则
Don’t call me; I’ll call you. 请上层模块,不要轮询/骚扰我,我通知你
好莱坞法则并非要求上层不得调用下层的任何方法,而是特指不要轮询
好莱坞法则=通知=观察者模式,体现了事件驱动程序设计,要点是注册+通知
二、观察者模式
@Deprecated(since="9")
public interface Observer {
/**
* 只要观察到的对象发生变化,就会调用此方法。
* 应用程序调用Observable对象的notifyObservers方法来通知该对象的所有观察者更改。
*
* @param o the observable object.
* @param arg an argument passed to the {@code notifyObservers}
* method.
*/
void update(Observable o, Object arg);
}
@Deprecated(since="9")
public class Observable {
private boolean changed = false;
private Vector<Observer> obs;
/**
忽略了不重要的函数
**/
/**
* 如果该对象发生了变化,则通知其所有观察者,并调用clearChanged方法来指示该对象不再改变。
* 每个观察者都有自己的update方法,它有两个参数:这个observable对象和arg参数。
*
* @param arg any object.
* @see java.util.Observable#clearChanged()
* @see java.util.Observable#hasChanged()
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Object[] arrLocal;
synchronized (this) {
/* 我们不希望观察者在持有自己的监视器的同时对任意代码进行回调。
* 我们从 Vector 中提取每个 Observable 并存储观察者状态的代码需要同步,但通知观察者不需要(不应该)。
* 这里任何潜在竞争条件的最坏结果是:
* 1) 新添加的观察者将错过正在进行的通知
* 2) 最近未注册的观察者在它不关心时将被错误地通知
*/
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
}