Observer模式
Observer模式通常有
1.Subject 提供注冊和刪除的方法,可以保存多個觀察者
2.ConcreteSubject 當(dāng)他的狀態(tài)發(fā)生改變時,通知所有的觀察者
3.Observer 定義當(dāng)目標(biāo)發(fā)生改變時需要更新的接口
4.ConcreteObserver 實現(xiàn)Observer接口
在Junit中,Subject和ConcreteSubject是一個,即TestResult
在Junit中,有三種方式實現(xiàn)TestListener接口,分別是TextUI,AWTUI,SwingUI. 使用Observer模式的原因是:當(dāng)增加其他UI方式時,只需要實現(xiàn)TestListener接口即可。
在TextUI方式中,是由ResultPrinter實現(xiàn)的.
代碼骨架:
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函數(shù)中,可能調(diào)用startTest,addFailure,addError,endTest。
//而這四個函數(shù)會通知注冊到改TestResult的所有的listeners
protected void run(final TestCase test) {
startTest(test);
addFailure(test, e); //runProtected調(diào)用
addError(test, e); //runProtected調(diào)用
endTest(test);
}
public void startTest(Test test) {
for (TestListener each : fListeners)
each.startTest(test);
}
//addFailure,addError,endTest省略
}