一、好莱坞法则

Don’t call me; I’ll call you. 请上层模块,不要轮询/骚扰我,我通知你
好莱坞法则并非要求上层不得调用下层的任何方法,而是特指不要轮询
好莱坞法则=通知=观察者模式,体现了事件驱动程序设计,要点是注册+通知

二、观察者模式

  1. @Deprecated(since="9")
  2. public interface Observer {
  3. /**
  4. * 只要观察到的对象发生变化,就会调用此方法。
  5. * 应用程序调用Observable对象的notifyObservers方法来通知该对象的所有观察者更改。
  6. *
  7. * @param o the observable object.
  8. * @param arg an argument passed to the {@code notifyObservers}
  9. * method.
  10. */
  11. void update(Observable o, Object arg);
  12. }
  13. @Deprecated(since="9")
  14. public class Observable {
  15. private boolean changed = false;
  16. private Vector<Observer> obs;
  17. /**
  18. 忽略了不重要的函数
  19. **/
  20. /**
  21. * 如果该对象发生了变化,则通知其所有观察者,并调用clearChanged方法来指示该对象不再改变。
  22. * 每个观察者都有自己的update方法,它有两个参数:这个observable对象和arg参数。
  23. *
  24. * @param arg any object.
  25. * @see java.util.Observable#clearChanged()
  26. * @see java.util.Observable#hasChanged()
  27. * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
  28. */
  29. public void notifyObservers(Object arg) {
  30. /*
  31. * a temporary array buffer, used as a snapshot of the state of
  32. * current Observers.
  33. */
  34. Object[] arrLocal;
  35. synchronized (this) {
  36. /* 我们不希望观察者在持有自己的监视器的同时对任意代码进行回调。
  37. * 我们从 Vector 中提取每个 Observable 并存储观察者状态的代码需要同步,但通知观察者不需要(不应该)。
  38. * 这里任何潜在竞争条件的最坏结果是:
  39. * 1) 新添加的观察者将错过正在进行的通知
  40. * 2) 最近未注册的观察者在它不关心时将被错误地通知
  41. */
  42. if (!changed)
  43. return;
  44. arrLocal = obs.toArray();
  45. clearChanged();
  46. }
  47. for (int i = arrLocal.length-1; i>=0; i--)
  48. ((Observer)arrLocal[i]).update(this, arg);
  49. }
  50. }