Observer模式
Observer模式通常有
1.Subject 提供注册和删除的方法,可以保存多个观察者
2.ConcreteSubject 当他的状态发生改变时,通知所有的观察者
3.Observer 定义当目标发生改变时需要更新的接口
4.ConcreteObserver 实现Observer接口
在Junit中,Subject和ConcreteSubject是一个,即TestResult
在Junit中,有三种方式实现TestListener接口,分别是TextUI,AWTUI,SwingUI. 使用Observer模式的原因是:当增加其他UI方式时,只需要实现TestListener接口即可。
在TextUI方式中,是由ResultPrinter实现的.
代码骨架:
interface TestListener {
public void addError(Test test, Throwable t);
public void addFailure(Test test, AssertionFailedError t);
public void endTest(Test test);
public void startTest(Test test);
}
class ResultPrinter implements TestListener {
public void addError(Test test, Throwable t){
System.out.println("ResultPrinter: addError");
}
public void addFailure(Test test, AssertionFailedError t){
System.out.println("ResultPrinter: addFailure");
}
public void endTest(Test test){
System.out.println("ResultPrinter: endTest");
}
public void startTest(Test test){
System.out.println("ResultPrinter: startTest");
}
}
//concrete subject
class TestResult extends Object{
protected List<TestListener> fListeners;
public synchronized void addListener(TestListener listener) {
fListeners.add(listener);
}
public synchronized void removeListener(TestListener listener) {
fListeners.remove(listener);
}
//run函数中,可能调用startTest,addFailure,addError,endTest。
//而这四个函数会通知注册到改TestResult的所有的listeners
protected void run(final TestCase test) {
startTest(test);
addFailure(test, e); //runProtected调用
addError(test, e); //runProtected调用
endTest(test);
}
public void startTest(Test test) {
for (TestListener each : fListeners)
each.startTest(test);
}
//addFailure,addError,endTest省略
}