Client(客户端)
public static void main(String[] args)
{
Component leaf1 = new Leaf();
Component leaf2 = new Leaf();
Composite comp1 = new Composite();
comp1.add(leaf1);
comp1.add(leaf2);
Component leaf3 = new Leaf();
Component leaf4 = new Leaf();
Composite comp2 = new Composite();
comp2.add(comp1);
comp2.add(leaf3);
comp2.add(leaf4);
comp2.doSomething();
}
这样对组合模式基本分析完成,继续接着看下在Junit组合模式是样实现的呢?
在Junit中有连个重要的概念,一个是TestCase一个是TestSuite;TestSuite是一个测试集合,一个TestSuite中可以包含一个或者多个TestSuite,当然也可以一个或者多个TestCase,而这两个对象都继承与Test接口。这样一分析,Test接口相当于组合模式中的抽象构件角色(Component),TestSuite相当于树枝构件角色(Composite),TestCase相当于树叶构件角色(Leaf)。接着我们对具体代码分析看看这块是否满足组合模式。
Test接口类:
public interface Test {
public abstract int countTestCases();
public abstract void run(TestResult result);
}
TestSuite实现:
public int countTestCases() {
int count= 0;
for (Enumeration e= tests(); e.hasMoreElements(); ) {
Test test= (Test)e.nextElement();
count= count + test.countTestCases();
}
return count;
}
public void run(TestResult result) {
for (Enumeration e= tests(); e.hasMoreElements(); ) {
if (result.shouldStop() )
break;
Test test= (Test)e.nextElement();
runTest(test, result);
}
}
TestCase实现
public int countTestCases() {
return 1;
}
public void run(TestResult result) {
result.run(this);
}
根据代码分析,Junit使用Composite模式后简化了JUnit的代码,JUnit可以统一处理组合结构TestSuite和单个对象TestCase。使JUnit开发变得简单容易,因为不需要区分部分和整体的区别,不需要写一些充斥着if else的选择语句。
另外,通过对TestCase对象和TestSuite的类层次结构基本对象的定义,TestCase可以被组合成更复杂的组合对象TestSuite,而这些组合对象又可以被组合,这样不断地递归下去。在程序的代码中,任何使用基本对象的地方都可方便的使用组合对象,大大简化系统维护和开发。