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省略
}