junit设计模式--组合模式
- Composite,英语翻译下,复合,组合。
组合模式有时候又叫做部分-整体模式,它使我们在树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户与复杂元素的内部结构解耦。将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。
- 组合模式(Composite)的组成
1.Component 抽象构件接口
为组合的对象声明接口。
在某些情况下实现从此接口派生出的所有类共有的默认行为。
定义一个接口可以访问及管理它的多个子部件。
2.Leaf 叶部件
在组合中表示叶节点对象,叶节点没有子节点。
定义组合中接口对象的行为。
3.Composite 组合类
定义有子节点(子部件)的部件的行为。
存储子节点(子部件)。
在Component接口中实现与子部件相关的操作。
4.Client 客户端
通过Component接口控制组合部件的对象。
OK,现在我们来写一个例子。
package org.linkinpark.junit.testjunit; /**
* @创建作者: LinkinPark
* @创建时间: 2016年2月4日
* @功能描述: 抽象构件接口。叶子类和组件类都要实现该接口
*/
public interface Component
{ void doSomething(); }
package org.linkinpark.junit.testjunit; /**
* @创建作者: LinkinPark
* @创建时间: 2016年2月4日
* @功能描述: 叶子类。注意:叶子类没有子节点
*/
public class Leaf implements Component
{ @Override
public void doSomething()
{
System.out.println("叶子类实现。。。");
} }
package org.linkinpark.junit.testjunit; import java.util.ArrayList;
import java.util.List; /**
* @创建作者: LinkinPark
* @创建时间: 2016年2月4日
* @功能描述: 组合类。组合类要包含子节点
*/
public class Composite implements Component
{ // List的类型是接口类型Component,这样就既可以放Leaf,又可以放Composite
private List<Component> list = new ArrayList<>(); public void add(Component component)
{
list.add(component);
} public void remove(Component component)
{
list.remove(component);
} public List<Component> getList()
{
return list;
} @Override
public void doSomething()
{
// 组合模式精髓。
for (Component component : list)
{
// 如果是叶子,直接执行。如果是复合的,则继续遍历其中包含的list。
component.doSomething();
}
} }
package org.linkinpark.junit.testjunit; import org.junit.Test; public class CompositeTest
{ @Test
public void testDoSomething()
{
Leaf leaf1 = new Leaf();
Leaf leaf2 = new Leaf();
Composite composite = new Composite();
composite.add(leaf1);
composite.add(leaf2); Leaf leaf3 = new Leaf();
Leaf leaf4 = new Leaf();
Composite composite1 = new Composite();
// 组合模式来了,下面让组合类中添加2个子节点和一个组合类节点
composite1.add(leaf3);
composite1.add(leaf4);
composite1.add(composite); composite1.doSomething();
} }
上面的代码写了一个叶子类,一个组合类,一个子类和组合类面向的接口,还有一个测试了,在测试类中我们往组合类中添加了2个叶子类,添加了一个包含2个叶子类的组合类,然后我们调用doSomething()方法来看下输出:
叶子类实现。。。
叶子类实现。。。
叶子类实现。。。
叶子类实现。。。
在JUnit中的应用
JUnit中的测试套件Suite是一个复杂元素,但是对于用户来说,TestCase和TestSuite在使用时无需进行区分,这就是应用了组合模式。OK,现在来看看junit源码中组合模式的使用:
Test:抽象构建接口:
package org.linkinpark.commons.framework; /**
* @创建作者: LinkinPark
* @创建时间: 2016年1月21日
* @功能描述: 测试接口,所有的测试类都要实现这个接口
*/
public interface Test
{
/**
* @创建时间: 2016年1月21日
* @相关参数: @return
* @功能描述: 测试用例执行的数量
*/
public abstract int countTestCases(); /**
* @创建时间: 2016年1月21日
* @相关参数: @param result
* @功能描述: 开始执行一个测试用例然后+收集测试结果
*/
public abstract void run(TestResult result);
}
TestCase:叶子类
public abstract class TestCase extends Assert implements Test
{
public int countTestCases()
{
return 1;
} public void run(TestResult result)
{
result.run(this);
} }
TestSuite:组合类
public class TestSuite implements Test
{
private String fName; // 测试类的类名,注意,TestCase中的fName是方法名。
private Vector<Test> fTests = new Vector<Test>(10); // 用来装用例的,可以的是TestCase,也可以是TestSuite /**
* @创建时间: 2016年1月22日
* @相关参数: @param test
* @功能描述: 添加一个测试
*/
public TestSuite addTest(Test test)
{
fTests.add(test);
return this;
} /**
* @创建时间: 2016年1月22日
* @相关参数: @param testClass
* @功能描述: 直接添加测试类到suite中
*/
public TestSuite addTestSuite(Class<? extends TestCase> testClass)
{
addTest(new TestSuite(testClass));
return this;
} public Enumeration<Test> tests()
{
return fTests.elements();
} /**
* 统计测试用例的个数
*/
public int countTestCases()
{
int count = 0;
for (Test each : fTests)
{
count += each.countTestCases();
}
return count;
} /**
* 运行测试
*/
public void run(TestResult result)
{
for (Test each : fTests)
{
if (result.shouldStop())
{
break;
}
runTest(each, result);
}
} public void runTest(Test test, TestResult result)
{
test.run(result);
}
}
OK,代码不多,但是利用了compiste模式。在TestSuite中,可以通过addTest()方法向TestSuite加入测试用例,也可以通过addTestSuite()方法向TestSuite加入用例集合。运行测试是通过run()方法,如果该实例是TestCase,那么执行真正的测试,如果该实例是TestSuite,那么就会通过TestSuite维护的fTests来访问每一个TestCase测试用例,然后才开始执行测试。因为这里的TestSuite也实现了Test组合类接口,所以我们可以往TestSuite中添加TestCase,也可以往TestSuite中添加TestSuite。注意:如果往TestSuite中添加的也是TestSuite,执行的时候会进行一次或多次递归。
junit设计模式--组合模式的更多相关文章
- 16. 星际争霸之php设计模式--组合模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- 【设计模式】Java设计模式 - 组合模式
Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- c#设计模式-组合模式
在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...
- [Head First设计模式]生活中学设计模式——组合模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 组合模式
用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构
- javascript设计模式-组合模式
组合模式所要解决的问题: 可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象. 客户端代码必须区别对象简单对象和 ...
- 设计模式组合模式(Composite)精华
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建 ...
- 设计模式 -- 组合模式 (Composite Pattern)
定义: 对象组合成部分整体结构,单个对象和组合对象具有一致性. 看了下大概结构就是集团总公司和子公司那种层级结构. 角色介绍: Component :抽象根节点:其实相当去总公司,抽象子类共有的方法: ...
随机推荐
- Javascript中遍历数组方法的性能对比
Javascript中常见的遍历数组的方法 1.for循环 for(var i = 0; i < arr.length; i++) { // do something. } 2.for循环的改进 ...
- 深入理解JVM(六)——类加载器原理
我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的 ...
- dulicate symbol for architecture i386 或者其他什么CPU架构 比如i386
昨天群里有个哥们遇到和么一个问题 , 错误的大概意思呢,就是 重复定义了 一个名字. 解决办法,只能修改名字啊. 而且,错误信息 也很明确的 支出了 重复定义的类文件名字PassGuardViewC ...
- java 重定向和转发的区别
注:原创链接 http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226892.html response.sendredirect(&q ...
- mongodb 创建用户
1.创建管理员 2.授权认证 3.给使用的数据库添加用户 普通连接(非授权连接)数据库 mongod -f /usr/local/etc/mongod.conf 授权连接数据库 mongod -f / ...
- 名片管理系统v1.1(main)
# version: 1.1# author: Mark import cords_tools while True: # 显示界面 cords_tools.show_cords() cords ...
- Android基础_多媒体
一.MediaPlayer Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现 ...
- 记录WEUI中滚动加载的一个BUG
最近写微信公众号,用到的技术栈是jq+vue的混合开发,采用的UI是移动端比较火的WEUI,在微信开发中应该较广泛.个人看惯了elementUI文档,相对于饿了么组件文档的详细,WEUI的文档还是比较 ...
- webpack学习之路
当自己在学习webpack的时候,在网上发现中文的很详细的教程很少,于是便想将自己学习webpack的笔记记录整理下来,便有了这篇文章,希望对大家有所帮助,如果有错误,欢迎大家指出. 在我们开始之前 ...
- C/C++中substr函数的应用(简单讲解)
substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H' *从字符串第一个字符开始截取长度为1的字符串 subst ...