Junit代码分析之观察者模式(2)

发表于:2013-03-06来源:新浪博客作者:土司点击数: 标签:junit
} public void endTest(Test test) { } public void startTest(Test test) { getWriter().print(.); if (fColumn++ = 40) { getWriter().println(); fColumn= 0; } } Junit中的说被观察者就是TestResult对象

  }

  public void endTest(Test test) {

  }

  public void startTest(Test test) {

  getWriter().print(".");

  if (fColumn++ >= 40) {

  getWriter().println();

  fColumn= 0;

  }

  }

  Junit中的说被观察者就是TestResult对象,它有添加观察者的方法:

  public synchronized voidaddListener(TestListener listener) {

  fListeners.addElement(listener);

  }

  在Junit中被观察者是如何通知观察者呢?请看这几个方法,在TestResult中下面几个方法都是循环遍历观察者列表,并调用相应的更新方法:

  public synchronized void addError(Test test, Throwable t) {

  fErrors.addElement(new TestFailure(test, t));

  for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) {

  ((TestListener)e.nextElement()).addError(test, t);

  }

  }

  public synchronized void addFailure(Test test, AssertionFailedError t) {

  fFailures.addElement(new TestFailure(test, t));

  for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) {

  ((TestListener)e.nextElement()).addFailure(test, t);

  }

  }

  public synchronized voidaddListener(TestListener listener) {

  fListeners.addElement(listener);

  }

  public synchronized voidremoveListener(TestListener listener) {

  fListeners.removeElement(listener);

  }

  private synchronized Vector cloneListeners() {

  return (Vector)fListeners.clone();

  }

  在Junit中使用观察者模式带来的好处:

  1)上面提到的Subject与Observer的抽象耦合,使JUnit可以支持不同的使用方式,为Junit执行平台(如textui、awtextui等)的扩展非常容易

  2)支持了广播通信,目标对象不关心有多少对象对自己注册,它只是通知注册的观察者

原文转自:http://blog.sina.com.cn/s/blog_6e0d94750101640x.html