junit组合模式应用

组合模式

定义

  将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性

构成

  Component:这是一个抽象角色,它给参加组合的对象规定一个接口。这个角色给出共有的接口和默认的行为。其实就我们的Test接口,它定义出run方法
  Composite:实现共有接口并维护一个测试用例的集合,它就是复合测试用例TestSuite
  Leaf:代表参加组合的对象,它没有下级子对象,仅定义出参加组合的原始对象的行为,其实就是单一的测试用例TestCase,它仅实现Test接口的方法

分类

  将管理子元素的方法定义在Composite类中;

  将管理子元素的方法定义在Component接口中;

java代码实现

将管理子元素的方法定义在Composite类中

public interface Component {
    public void doSomething();
}
public class Composite implements Component {
    private List<Component> list = new ArrayList<Component>();

    public void add(Component component) {
        list.add(component);
    }

    public void remove(Component component) {
        list.remove(component);
    }

    public List<Component> getAll() {
        return list;
    }

    @Override
    public void doSomething() {
        for (Component component : list) {
            component.doSomething();
        }
    }
}
public class Leaf implements Component {
    public void doSomething() {
        System.out.println("dosomething");
    }
}
public class Client {
    public static void main(String[] args) {
        Component leaf1 = new Leaf();
        Component leaf2 = new Leaf();

        Composite composite = new Composite();
        composite.add(leaf1);
        composite.add(leaf2);

        Composite composite2 = new Composite();
        Component leaf3 = new Leaf();
        composite2.add(composite);
        composite2.add(leaf3);

        composite2.doSomething();
    }
}

将管理子元素的方法定义在Component接口中

public interface Component {
    public void doSomething();
    public void add(Component component);
    public void remove(Component component) ;
    public List<Component> getAll() ;
}
public class Composite implements Component {
    private List<Component> list = new ArrayList<Component>();

    public void add(Component component) {
        list.add(component);
    }

    public void remove(Component component) {
        list.remove(component);
    }

    public List<Component> getAll() {
        return list;
    }

    @Override
    public void doSomething() {
        for (Component component : list) {
            component.doSomething();
        }
    }
}
public class Leaf implements Component {
    public void doSomething() {
        System.out.println("dosomething");
    }

    public void add(Component component) {
    }

    public List<Component> getAll() {
        return null;
    }

    public void remove(Component component) {
    }
}
public class Client {
    public static void main(String[] args) {
        Component leaf1 = new Leaf();
        Component leaf2 = new Leaf();

        Composite composite = new Composite();
        composite.add(leaf1);
        composite.add(leaf2);

        Composite composite2 = new Composite();
        Component leaf3 = new Leaf();
        composite2.add(composite);
        composite2.add(leaf3);

        composite2.doSomething();
    }
}

组合模式在junit3框架中的应用

public interface Test {
       public abstract void run(TestResult result);
}  

public abstract class TestCase extends Assert implements Test {
    public void run(TestResult result) {
        result.run(this);
    }
}  

public class TestSuite implements Test {
    private Vector fTests= new Vector(10);  

    public void addTest(Test test) {
        fTests.addElement(test);
    }  

    public void addTestSuite(Class testClass) {
        addTest(new TestSuite(testClass));
    }  

    public void run(TestResult result) {
        for (Enumeration e= tests(); e.hasMoreElements(); ) {
            if (result.shouldStop() )
                break;
            Test test= (Test)e.nextElement();
            runTest(test, result);
        }
    }  

    public Enumeration tests() {
        return fTests.elements();
    }
}  

TestSuit类中有一个属性fTests (Vector类型)中保存了其子测试用例,提供addTest方法来实现增加子对象TestCase,并且还提供testCount 和tests 等方法来操作子对象。最后通过run()方法实现对其子对象进行委托(delegate),最后还提供addTestSuite方法实现递归,构造成树形;

TestCase或者TestSuite都是对Test接口进行实现的。由于TestCase和TestSuit两者都符合Test接口,我们可以通过addTestSuite递归地将TestSuite再组合成TestSuite,这样将构成树形结构。所有开发者都能够创建他们自己的TestSuit。测试人员可创建一个组合了这些测试用例的TestSuit来运行它们所有的TestCase,形如:

public static Test suite() {
    TestSuite suite1 = new TestSuite("我的测试TestSuit1");
    TestSuite suite2 = new TestSuite("我的测试TestSuit2");
    suite1.addTestSuite(xxx.class);
    suite2.addTestSuite(xxx.class);
    suite1.addTest(suite2);
    return suite1;
}

junit3中引入组合模式的好处

1)简化了JUnit的代码 JUnit可以统一处理组合结构TestSuite和单个对象TestCase。使JUnit开发变得简单容易,因为不需要区分部分和整体的区别,不需要写一些充斥着if else的选择语句;

2)定义了TestCase对象和TestSuite的类层次结构基本对象TestCase可以被组合成更复杂的组合对象TestSuite,而这些组合对象又可以被组合,如上个例子,这样不断地递归下去。在程序的代码中,任何使用基本对象的地方都可方便的使用组合对象,大大简化系统维护和开发;

3)使得更容易增加新的类型的TestCase;

时间: 2024-08-01 10:44:28

junit组合模式应用的相关文章

Junit学习笔记(二): 源码分析(2)-命令和组合模式

命令模式 命令模式的优点: 命令模式将调用操作的对象与如何实现该操作的对象解耦. 将命令当成一个头等对象,它们可以像一般对象那样进行操纵和扩展 可以将多个命令复合成一个命令,与Composite模式结合使用 增加新的命令很容易,隔离对现有类的影响 可以与备忘录模式配合,实现撤销功能. 命令模式图: 由此带来的好处:1.客户无需使用任何条件语句去判断测试的类型,可以用统一的方式调用测试和测试套件,解除了客户与具体测试子类的耦合2.如果要增加新的TestCase也很容易,实现Test接口即可,不会影

组合模式(Composite)

一.组合模式介绍 组合模式:将对象组合成树形结构以表示:部分--整体 的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. java中的组合是指:在A类里定义一个B类的引用,A拥有了B,叫组合.只是单纯的组合而已,而不是一种设计模式. 组合和组合模式不是一回事! 基本上见到的树形结构都使用到了组合模式. 组合模式结构图: 组合模式中有几个核心的部分: Leaf(叶子):表示该节点下面没有其他子节点了,就称为叶子 Compostie(容器构件):容器构件,该节点下还有其他子节点,理解

java设计模式 GOF23 09 组合模式

一.组合模式简介 把整体和部分的关系用树形结构表示,从而可以统一处理. 二.组合模式实现细节 1)抽象构建:定义叶子和容器的共同特点. 2)叶子:没有子节点 3)容器:有容器的特征,可以包含子节点(一般实现的时候在这里添加容器存放子节点) 三.简单代码实现 package com.lz.combination; import java.util.ArrayList; import java.util.List; /* * 抽象构建 */ public interface IComponent {

设计模式(八)组合模式

使用组合模式的场景:把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象. 组合模式核心: 抽象构件(Component)角色:定义了叶子和容器构件的共同点. 叶子(Leaf)构件角色:无子节点. 容器(Composite)构件角色:有容器特征,可以包含子节点. 组合模式工作流程分析: 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子. 当容器对象的指定方法被调用时,将遍历整个树形结构,

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯

10.设计模式_组合模式

转载自   http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象在功能上区别,导致在操作过程中必须区分简单对象和复合对象,这样就会导致客户调用带来不必要的麻烦,然而作为客户,它们希望能够始终一致地对待简单对象和复合对象.然而组合模式就是

Java设计模式应用——组合模式

组合模式实际上是一种树形数据结构.以windows目录系统举例,怎么样用java语言描述一个文件夹? 定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类. 进一步抽象,把文件夹和文件都看做节点,于是一个文件夹就可以描述为一个节点类,包含若干个子节点. 我们看看组合模式的代码 // 抽象节点 public abstract class Node { protected String name; abstract void add(Node node); abstract void rem

设计模式 -- 组合模式(Composite)

写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识组合模式,包括:定义.结构.参考实现 体会组合模式,包括:场景问题.不用模式的解决方案.使用模式的解决方案 理解组合模式,包括:认识组合模式.安全性和透明性.父组件引用.环状引用.组合模式的优缺点 思考组合模式,包括:组合模式的本质.何时选用 参考内容: 1.<研磨设计模式> 一书,作者:陈臣.王斌 --

11 组合模式

组合模式(Composite)定义:将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. UML类图如下: 比如<大话>中举的例子,公司总部在北京,然后在南京.杭州设有办事处,总公司和分支办事处都有相似的组织结构,比如都有人力资源部.财务部等.如下图: 再有HeadFirst举的关于菜单的例子,如下图: 如果程序需要表达上面例子中的公司层级组织或是菜单层级的结构,就可以采用组合模式. 组合模式能让我们用树形方式创建对象的