3.UML圖:
圖中單個對象是樹葉(Leaf),而組合結(jié)構(gòu)是Compoiste,它維護了一個Leaf的集合。而Component是一個抽象角色,給出了共有接口和默認行為,也是JUnit源碼中的Test接口。
4.效果:
1)定義了基本對象和組合對象的類層次結(jié)構(gòu),通過遞歸可以產(chǎn)生更復(fù)雜的組合對象
2)簡化了客戶代碼,客戶可以使用一致的方式對待單個對象和組合結(jié)構(gòu)
3)添加新的組件變的很容易。但這個會帶來一個問題,你無法限制組件中的組件,只能靠運行時的檢查來施加必要的約束條件
具體到JUnit源碼,單個對象是TestCase,而復(fù)合結(jié)構(gòu)是TestSuite,Test是抽象角色只有一個run方法。TestSuite維護了一個TestCase對象的集合fTests:
<!----> private Vector fTests= new Vector(10);
/**
* Adds a test to the suite.
*/
public void addTest(Test test) {
fTests.addElement(test);
}
/**
* Runs the tests and collects their result in a TestResult.
*/
public void run(TestResult result) {
for (Enumeration e= tests(); e.hasMoreElements(); ) {
if (result.shouldStop() )
break;
Test test= (Test)e.nextElement();
test.run(result);
}
}
當(dāng)執(zhí)行run方法時遍歷這個集合,調(diào)用里面每個TestCase對象的run()方法,從而執(zhí)行測試。我們使用的時候僅僅需要把TestCase添加到集合內(nèi),然后用一致的方式(run方法)調(diào)用他們進行測試。
考慮使用Composite模式之后帶來的好處:
1)JUnit可以統(tǒng)一地處理組合結(jié)構(gòu)TestSuite和單個對象TestCase,避免了條件判斷,并且可以遞歸產(chǎn)生更復(fù)雜的測試對象
2)很容易增加新的TestCase。