一、模式说明

  能够使容器与内容物具有一致性,创造出递归结构的模式就是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. 小程序通过web-view实现与h5页面之间的交互

    在小程序端使用web-view内嵌网页,通过 src 携带参数,通过 @message 接收h5传回的数据 <template> <view> <web-view :sr ...

  2. 数学软件实训1-MATLAB程序设计及应用初步

    数学软件实训任务一 一 题目:MATLAB程序设计及应用初步 二 目的:掌握MATLAB程序设计的基本方法,会利用MATLAB程序设计思想编程处理一些简单问题. 三 要求: 1 掌握控制流的基本语法结 ...

  3. markdown超链接怎么写?

    效果:我的微博 #上面的效果就是下面这种写法: [ 我的微博 ]( http://weibo.com/5833683560/profile?topnav=1&wvr=6&is_all= ...

  4. 7.8 Varnish 其他命令

  5. 0108 spring的申明式事务

    背景 互联网的金融和电商行业,最关注数据库事务. 业务核心 说明 金融行业-金融产品金额 不允许发生错误 电商行业-商品交易金额,商品库存 不允许发生错误 面临的难点: 高并发下保证: 数据一致性,高 ...

  6. 使用conda创建虚拟环境

    conda创建python虚拟环境 前言 conda常用的命令: conda list 查看安装了哪些包. conda env list 或 conda info -e 查看当前存在哪些虚拟环境 co ...

  7. 易语言加壳SDK(宏标记)

    转载 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310508c31490797634b87834e29938448e435061 ...

  8. 《ES6标准入门》(阮一峰)--6.正则的扩展

    1.RegExp 构造函数 在 ES5 中,RegExp构造函数的参数有两种情况. 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag). var regex = new Re ...

  9. POJ 3916:Duplicate Removal 将相近的重复元素删除

    Duplicate Removal Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1745   Accepted: 1213 ...

  10. nodejs学习笔记(一):centos7安装node环境

    由于windows环境安装nodejs只需要访问官方网站下载压缩包,解压即可. 首先检查自己是否安装==wget==,已安装可以跳过这步,未安装则需要先安装: linux yum install -y ...