• 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设计模式--组合模式的更多相关文章

  1. 16. 星际争霸之php设计模式--组合模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  3. 【设计模式】Java设计模式 - 组合模式

    Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  4. c#设计模式-组合模式

    在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...

  5. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  6. JAVA 设计模式 组合模式

    用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构

  7. javascript设计模式-组合模式

    组合模式所要解决的问题: 可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象. 客户端代码必须区别对象简单对象和 ...

  8. 设计模式组合模式(Composite)精华

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建 ...

  9. 设计模式 -- 组合模式 (Composite Pattern)

    定义: 对象组合成部分整体结构,单个对象和组合对象具有一致性. 看了下大概结构就是集团总公司和子公司那种层级结构. 角色介绍: Component :抽象根节点:其实相当去总公司,抽象子类共有的方法: ...

随机推荐

  1. Loadrunner11.0调用Jar包

    又好几天不写东西了,是不是意味着最近没有大的进步,时时敲打自己. 今天把loadrunner如何调用Jar包搞定了,现在把配置的过程中需要注意的东西写下来,分享给小伙伴儿,减少他们在前行路上的弯路. ...

  2. git常用使用命令

    Git远程操作详解(from 阮一峰) git clone.git remote.git fetch.git pull.git push git拉取远程分支并创建本地分支 git中文学习文档(详细) ...

  3. 【Win 10 应用开发】MIDI 音乐合成——更改乐器音色

    在开始今天的吹 BB 博文之前,说点题外话. 首先,上次老周给大伙伴们介绍完发送 MIDI 音符,本来说好的接着说一下如何更改乐器音色,为啥这么久都没更新呢.特特来解释一下,最近老周接了一个 ASP. ...

  4. Fineui js getText

    需要自己写js的时候.需要取值. var ddlgenderid='<%=ddlgender.clientID%>';function reader(value){f(ddlgenderi ...

  5. Python 浅析线程(threading模块)和进程(process)

    线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 进程与线程 什么 ...

  6. 了解adb的基本原理

    ADB就是Android调试桥的意思,很形象.但不知道是windows本身的原因还是windows乱七八糟软件太多,用USB调试手机时,经常连不上ADB,或者就出现offline,导致费时费力,焦头烂 ...

  7. 使用jemeter手工编写注册、登陆脚本 运用 fiddler (一)

    我们要使用jemeter来手工写一个脚本 我们要使用到两个工具 一个 就是  jmeter  一个就是 fiddler 为什么要使用fiddler   ? 因为能够帮我们正确精准的找到我们需要的数据 ...

  8. weui 中的tabbar导航

    最近做微信的服务号项目,用的weui作为主要的ui,但是对于用惯了ele ui的开发者来说,文档貌似有点不友好.真是很让人头疼! 所以结合着自己做的项目,随便写一点东西. 比如说,tabbar导航的切 ...

  9. 开发问题(一)在windows和linux端口占用问题

    前言 今天在MyEclipse中使用tomcat发现tomcat端口8080竟然被占用了,所以就找了一下解决办法共参考! 在网络程序的调试过程中,经常发生一些出乎意料的事情,比如创建一个TCP服务失败 ...

  10. x64_dbg破解64位WinSnap4.5.6图文视频教程

    一.软件简单介绍: WinSnap是一个轻巧.快速.简单.友好的截图工具,提供屏幕截图和图像编辑功能.和其它截图软件相比其最大亮点在于WinSnap可以捕获或去除Win7的 Aero玻璃效果.WinS ...