1、模式简介

  组合模式可以将对象以树形结构来表现“整体/部分”层次结构,让客户以一致的方式处理个别形象以及对象组合。

  组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。使用组合模式,我们能把相同的操作应用在组合的个别对象上,换句话说,我们可以忽略对象组合的个别对象之间的差别。

2、案例

  本例是模拟电脑中文件系统的层级结构。我们定义了一个文件的实体类MyFile,其中除了名称(name)、是否是文件夹(isDir)、文件大小(size)、所处层级(level)外,还有一个子文件列表的引用。代码如下:

  文件实体类MyFile.java中的代码:

import java.util.ArrayList;
import java.util.List; public class MyFile {
private String name; // 文件名称
private boolean isDir; // 是否是文件夹,是返回true,否则返回false
private double size; // 文件大小
private int level; // 文件所在的层级,根文件是0级
private List<MyFile> subFiles; // 文件的子文件(只有文件夹才有子文件) public MyFile() {
subFiles = new ArrayList<>();
} public MyFile(String name, boolean isDir, double size, int level) {
this();
this.name = name;
this.isDir = isDir;
this.size = size;
this.level = level;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public boolean isDir() {
return isDir;
} public void setDir(boolean isDir) {
this.isDir = isDir;
} public double getSize() {
return size;
} public void setSize(double size) {
this.size = size;
} public int getLevel() {
return level;
} public void setLevel(int level) {
this.level = level;
} public List<MyFile> getSubFiles() {
return subFiles;
} public void setSubFiles(List<MyFile> subFiles) {
this.subFiles = subFiles;
} public void addSubFile(MyFile file) {
this.subFiles.add(file);
} @Override
public String toString() {
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= level; i++) {
sb.append("----");
}
sb.append("(" + (isDir() ? "dir" : "file") + ")");
sb.append(getName());
sb.append("(" + getSize() + "K)");
return sb.toString();
}
}

  测试类Test.java中的代码:

import java.util.List;

public class Test {
public static void main(String[] args) {
// 初始化文件结构树
MyFile rootDir = initFileTree();
// 按层级打印文件结构树
printFileInfo(rootDir);
} // 初始化文件结构树
private static MyFile initFileTree() {
MyFile rootDir = new MyFile("rootDir", true, 100, 0); MyFile subDir1_1 = new MyFile("subDir1_1", true, 50, 1);
MyFile subFile2_1_1 = new MyFile("subFile2_1_1", false, 10, 2);
MyFile subFile2_1_2 = new MyFile("subFile2_1_2", false, 15, 2);
MyFile subDir2_1_1 = new MyFile("subDir2_1_1", true, 25, 2);
MyFile subDir2_1_2 = new MyFile("subDir2_1_2", true, 0, 2);
MyFile subFile3_1_1_1 = new MyFile("subFile3_1_1_1", false, 19, 3);
MyFile subFile3_1_1_2 = new MyFile("subFile3_1_1_2", false, 6, 3);
subDir2_1_1.addSubFile(subFile3_1_1_1);
subDir2_1_1.addSubFile(subFile3_1_1_2);
subDir1_1.addSubFile(subFile2_1_1);
subDir1_1.addSubFile(subFile2_1_2);
subDir1_1.addSubFile(subDir2_1_1);
subDir1_1.addSubFile(subDir2_1_2);
rootDir.addSubFile(subDir1_1); MyFile subDir1_2 = new MyFile("subDir1_2", true, 30, 1);
MyFile subFile2_2_1 = new MyFile("subFile2_2_1", false, 22, 2);
MyFile subFile2_2_2 = new MyFile("subFile2_2_2", false, 8, 2);
subDir1_2.addSubFile(subFile2_2_1);
subDir1_2.addSubFile(subFile2_2_2);
rootDir.addSubFile(subDir1_2); MyFile subDir1_3 = new MyFile("subDir1_3", true, 20, 1);
MyFile subDir2_3_1 = new MyFile("subDir2_3_1", true, 20, 2);
MyFile subDir3_3_1_1 = new MyFile("subDir2_3_1_1", true, 20, 3);
MyFile subDir4_3_1_1_1 = new MyFile("subDir2_3_1_1_1", true, 20, 4);
MyFile subFile5_3_1_1_1_1 = new MyFile("subFile2_3_1_1_1_1", false, 20, 5);
subDir4_3_1_1_1.addSubFile(subFile5_3_1_1_1_1);
subDir3_3_1_1.addSubFile(subDir4_3_1_1_1);
subDir2_3_1.addSubFile(subDir3_3_1_1);
subDir1_3.addSubFile(subDir2_3_1);
rootDir.addSubFile(subDir1_3); return rootDir;
} // 递归打印文件树信息
private static void printFileInfo(MyFile file) {
System.out.println(file.toString());
List<MyFile> subFiles = file.getSubFiles();
if (subFiles != null && subFiles.size() > 0) {
for (MyFile subFile : subFiles) {
printFileInfo(subFile);
}
} else {
}
}
}

  运行结果如下图所示:


  最后贴出组合模式在GitHub中的代码:【GitHub - Composite】

【设计模式 - 8】之组合模式(Composite)的更多相关文章

  1. 设计模式系列之组合模式(Composite Pattern)——树形结构的处理

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 设计模式学习心得<组合模式 Composite>

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  3. 《JAVA设计模式》之组合模式(Composite)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...

  4. 设计模式之:组合模式(Composite)

    支持原创:http://blog.csdn.net/hguisu/article/details/7530783 设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构 ...

  5. 设计模式(七)组合模式Composite(结构型)

    设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...

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

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

  7. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

  8. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  9. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  10. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

随机推荐

  1. Windows phone 之自定义控件(补充)

    <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x= ...

  2. 配置并学习微信JS-SDK(2)—扫一扫接口http://www.qq210.com/shoutu/android

    http://www.qq210.com/shoutu/android //c_开头的js变量是服务器传过来的 var c_access_token = "<?=$access_tok ...

  3. 使用PHP脚本来写Daemon程序

    什么是Daemon进程   这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰 ...

  4. AngularJS初体验

    最近突然发现,Coding.net真是一个神奇的网站.这各网站90%的请求都是通过ajax完成的.可以发现,不管你点任何链接,网页都不会刷新,点击浏览器的返回或前进按钮也是这样,打开chrome的开发 ...

  5. PHPCMS标签:PC标签模板语法规则

    模板语法规则1.变量表示{$name} 被解析成 <?=$name?>,表示显示变量$name的值,其中的“name”由英文字母.数字和下划线组成首字母必须是英文字母或者下划线. 2.常量 ...

  6. ubuntu下mysql安装与测试

    原文地址: http://www.cnblogs.com/zhuyp1015/p/3561470.html 注意:原文地址中,最后g++ 编译源代码时少了个字母.添上即可. ubuntu上安装mysq ...

  7. Hive 的 排序

    全排序:order by对全部所有的数据进行排序,在实现的时候是放到一个reduce中进行的,可以想象这样做效率是比较低的: 局部排序:sort by对数据进行分组,然后在组内进行排序,每个reduc ...

  8. linux系统下,递归删除.svn文件

    linux系统下,递归删除.svn文件 SVNLinux 进入要删除的目录,执行下面的命令就可以啦. find . -name "*.svn"  | xargs rm -rf

  9. 编程思想—依赖注入(DI)并非实现控制反转(IOC)的最佳方法

    以构造函数注入为例: public class TestClass(IClassA a,IClassB b, IClassC C,IClassD d) { public void Method1() ...

  10. C# this.Invoke()的作用和用法(摘)

    Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();   在多线程编程中,我们经常要在工作线程 ...