一、模式说明

  能够使容器与内容物具有一致性,创造出递归结构的模式就是Composite组合模式。

  举个例子:计算机中的文件系统中有文件和文件夹的概念,我们知道,文件夹可以包含文件,也可以包含子文件夹,子文件夹中又可以包含文件和文件夹。如果将文件和文件夹都看作“目录条目(Directory Entry)”,那么文件系统就形成了一个递归的容器,这就是一种组合模式。

  更多例子,在Windows操作系统中,一个窗口中可以包含子窗口,从而形成容器的递归;一条宏命令又可以包含另一个宏命令;一个文章章节又可以包含多个子章节。。。这种具有树状结构的数据都适用于组合模式。

二、模式类图

三、代码示例

  在示例程序中,我们创建一个Entry目录条目类,并让File文件类和Dictory文件夹类去继承它。

1、FileTreatementException类

package com.designpattern.cn.Entry;

public class FileTreatementException extends RuntimeException {
public FileTreatementException(){ }
public FileTreatementException(String msg){
super(msg);
}
}

2、Entry条目类

package com.designpattern.cn.Entry;

public abstract class Entry {
public abstract String getName();
public abstract int getSize();
public Entry add(Entry entry) throws FileTreatementException{
throw new FileTreatementException();
}
public void PrintList(){
printList("");
}
protected abstract void printList(String prefix);
public String toString(){
return getName() + " (" + getSize() + ")";
}
}

3、File文件类

package com.designpattern.cn.Entry;

public class File extends Entry {
private String name;
private int size;
public File(String name, int size){
this.name = name;
this.size = size;
} public String getName(){
return name;
} public int getSize(){
return size;
} protected void printList(String prefix){
System.out.println(prefix + "/" + this);
}
}

4、Directory目录类

package com.designpattern.cn.Entry;

import java.util.ArrayList;
import java.util.Iterator; public class Directory extends Entry {
private String name;
private ArrayList directory = new ArrayList();
public Directory(String name){
this.name = name;
}
public String getName(){
return name;
}
public int getSize(){
int size = 0;
Iterator it = directory.iterator();
while (it.hasNext()){
Entry entry = (Entry) it.next();
size += entry.getSize();
}
return size;
}
public Entry add(Entry entry){
directory.add(entry);
return this;
}
protected void printList(String prefix){
System.out.println(prefix + "/" + this);
Iterator it = directory.iterator();
while (it.hasNext()){
Entry entry = (Entry) it.next();
entry.printList(prefix + "/" + name);
}
}
}

5、Main方法类和运行结果

package com.designpattern.cn.Entry;

public class Main {
public static void main(String[] args) {
try {
System.out.println("Making root entries...");
Directory rootdir = new Directory("root");
Directory bindir = new Directory("bin");
Directory tmpdir = new Directory("tmp");
Directory usrdir = new Directory("usr"); rootdir.add(bindir);
rootdir.add(tmpdir);
rootdir.add(usrdir);
bindir.add(new File("vi", 10000));
bindir.add(new File("latex", 20000));
rootdir.printList("");
}catch (FileTreatementException e){
e.printStackTrace();
}
}
}

四、模式中的角色

  • Leaf树叶角色:该角色中不能再放入其他对象,如示例中的File类;
  • Composite复合物类:在其中可以放入Leaf和Composite复合物,如示例程序中的Directory类;
  • Component类:使Leaf和Composite角色具有一致性的角色,如示例中的Entry类;
  • Client客户角色:使用复合模式的对象。

五、相关的设计模式

  • Command模式:Command模式编写宏命令时会使用Composite模式;
  • Vistor访问者模式:可以使用访问者模式访问Composite中的递归结构;
  • Decorator装饰者模式:Composite模式通过Component角色使Composite和Leaf具有一致性,Decorator模式使装饰框和内容具有一致性;

一天一个设计模式——Composite组合模式的更多相关文章

  1. C++设计模式-Composite组合模式

    Composite组合模式作用:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. UML图如下: 在Component中声明所有用来 ...

  2. [C++设计模式] composite 组合模式

    组合(Composite)模式的其他翻译名称也非常多,比方合成模式.树模式等等.在<设计模式>一书中给出的定义是:将对象以树形结构组织起来,以达成"部分-总体"的层次结 ...

  3. C#设计模式(10)——组合模式(Composite Pattern)

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

  4. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

  5. C#设计模式(10)——组合模式(Composite Pattern)(转)

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

  6. 设计模式08: Composite 组合模式(结构型模式)

    Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface I ...

  7. C#设计模式:组合模式(Composite Pattern)

    一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; ...

  8. JavaScript设计模式之----组合模式

    javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...

  9. 十一、Composite 组合模式

    原理: 代码清单 Entity public abstract class Entry { public abstract String getName(); public abstract int ...

随机推荐

  1. Product of Polynomials

    题意:多项式相乘,合并同类项后输出每一项的系数. 题目链接:https://www.patest.cn/contests/pat-a-practise/1009 分析:注意合并后系数为0,这一项就不存 ...

  2. java类 2.18

    1. 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员.如: 如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量.如: 2. 在普通成员方法中,则可 ...

  3. es678910语法糖

    傲娇: 新es是js的进步,是编程的进步,es6已经过去了5年了,兼容率达到了90%,还是有10%的手机不兼容,那到底应不应该去照顾那些跟不上的人,我觉得是不应该的,新es能5行写出来的功能,我为什么 ...

  4. GDI4

    前几篇我已经向大家介绍了如何使用GDI+来绘图,并做了一个截图的实例,这篇我向大家介绍下如何来做一个类似windows画图的工具.个人认为如果想做一个功能强大的绘图工具,那么单纯掌握GDI还远远不够, ...

  5. python进行md5加密的两种方法

    本文转自:https://www.cnblogs.com/zknublx/p/6212590.html 一. 使用md5包 import md5 src = 'this is a md5 test.' ...

  6. C. Basketball Exercise dp

    C. Basketball Exercise time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  7. JuJu团队11月25号工作汇报

    JuJu团队11月25号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 于达 实现随机采样函数,进行onehot处理 预处理数据集,将数据集转为矩阵读入 数据集预处理比想象中麻 ...

  8. mybaits-plus总结

    import java.math.BigDecimal; import java.util.Arrays; import java.util.Date; import java.util.List; ...

  9. 【LeetCode】226. 翻转二叉树

    题目 翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 本题同[剑指Offer]面试题27. 二叉树的镜 ...

  10. Golang的运算符优先级实操案例

    Golang的运算符优先级实操案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.运算符优先级案例 运算符是用来在程序运行时执行数学或逻辑运算的,在Go语言中,一个表达式可以包 ...