组合模式也叫做“部分-总体”模式,这样事实上定义也就非常明显了,正好和数据结构的知识相相应。把对象组合成树形结构以表示“部分-总体”的层次结构。

先看类图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVvMDY1MDAw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="447" height="304" alt="">

首先分析一下这个类图,Leaf和Composite是同辈的,都是继承父类Component,又由于Component中存在Leaf子类,所以他和Component还存在着聚合关系

举一个非经常见的样例,我们天天对着电脑。和各种文件,目录打交道,这不就是一个非常好地组合模式吗?

来看看类图:

来看看详细的实现代码:

AbstractFile为组合中的对象声明接口,实现全部类共同拥有接口的默认行为。

package composite;

import java.util.*;    //加入引用

public abstract class AbstractFile {
protected String name; // 定义name字段 public void printName() {
System.out.println(name);
} // 通常都用add和remove方法来提供添加或移除树叶或树枝的功能
public abstract boolean addChild(AbstractFile file); // 添加 public abstract boolean removeChild(AbstractFile file); // 移除
// 一个集合,存放摘要文件的子文件的对象 public abstract List<AbstractFile> getChildren();
}

File为子类文件,继承父类,也是树中所谓的叶子节点。叶子节点是没有子节点的,所以父类所谓的方法并不能实现,返回true和null

package composite;

import java.util.*;

public class File extends AbstractFile {
public File(String name) {
this.name = name;
}
//文件并没有加入的能力,它仅仅是一个单独的个体
public boolean addChild(AbstractFile file) {
return false;
}
//对于文件本身,已经是叶子节点了。所以也无删除子文件的功能
public boolean removeChild(AbstractFile file) {
return false;
} // 因为File已经是叶子节点了。所以就不存在集合这一说,所以这种方法返回的是空值
public List<AbstractFile> getChildren() {
return null;
}
}

Folder为子类目录,相同也继承于父类。可是此类仅仅是一个普通的节点,里边依然包括叶子节点。

package composite;

import java.util.*;

public class Folder extends AbstractFile {

	private List<AbstractFile> childList ;

	public Folder(String name) {
this.name = name;
//用来建立一个集合保存子文件
this.childList = new ArrayList<AbstractFile>();
}
//加入子文件
public boolean addChild(AbstractFile file) {
return childList.add(file);
}
//删除子文件
public boolean removeChild(AbstractFile file) {
return childList.remove(file);
} // 子类的返回类型应该和父类的定义保持一致
public List<AbstractFile> getChildren() {
return childList;
} }

最后来看看client是怎样调用和打印的

package composite;

import java.util.List;

public class Client {
public static void main(String[] args) {
// TODO 自己主动生成的方法存根
// 构造一个树形的文件、文件夹结构
AbstractFile rootFolder = new Folder("c:\\");
AbstractFile compositeFolder = new Folder("composite");
AbstractFile windowsFolder = new Folder("windows");
AbstractFile file = new File("TestComposite.java"); rootFolder.addChild(compositeFolder);
rootFolder.addChild(windowsFolder);
compositeFolder.addChild(file);
// 打印文件夹文件树
printTree(rootFolder);
} private static void printTree(AbstractFile ifile) {
ifile.printName();
List<AbstractFile> children = ifile.getChildren();
if (children == null)
return;
for (AbstractFile file : children) {
printTree(file); // 打印方法的调用
}
}
}

透明方式与安全方式

在File子类中,他所谓的各种方法都是不实行的,可是却依然存在。这样的方式就叫做“透明方式”;这样做的优点就是叶子节点和枝节点对于外界没有差别,它们具备全然一致的行为接口;可是问题也会非常明显的。那就是在File中那些所谓的方法的存在是毫无意义的;

假设不想让其做无用功,也就是把File子类中的无意义的方法都去掉,这样的方式叫做“安全方式”;可是因为是不透明的,所以他们就不能具有一致的接口了,这样反而添加了其复杂性,client的调用须要再添加其对应的推断。

什么时候使用组合模式?

1)需求中体现的是“部分-总体”的层次的结构时,使用此模式;

2)用户希望忽略组合对象与单个对象的不同,统一地使用组合结构中的全部的对象的时候,使用此模式;

最后总结:

每一个模式事实上都是须要慢慢理解的,真正的懂得了它的精髓所在,那当再看到类似的字眼的时候就会有亲近的感觉,对于组合模式总结为下面几点:

  • 组合模式提供一个结构,可同一时候包容个别对象和组合对象;
  • 同意客户对个别对象以及组合对象一视同仁;
  • 组合结构内的随意对象都称为组件,组件能够是组合,也能够是叶子节点;
  • 在实现组合模式时,有很多设计上的折衷。

    这时候就要就情况选择透明方式还是安全方式了。


     Composite是构造型的设计模式之中的一个。通过递归手段来构造诸如文件系统之类的属性的对象结构。知识之间是相互连通的,就看你是不是选择最短路径了。

OO模式-Composite的更多相关文章

  1. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

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

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

  3. 合成模式(Composite)-结构型

    原理 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 有时候又叫做部分-整体 ...

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

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

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

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

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

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

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

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

  8. 组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)

    组合模式(合成模式 COMPOSITE) 意图 将对象组合成树形结构以表示“部分-整体”的层次结构. Composite使得用户对单个对象和组合对象的使用具有一致性.   树形结构介绍 为了便于理解, ...

  9. 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释

    组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...

随机推荐

  1. 数的计数(noip2001,动态规划递推)

    题目链接: 普通版: https://www.luogu.org/problemnew/show/P1028 数据加强版: https://www.luogu.org/problemnew/show/ ...

  2. 「 HDOJ P2227 」 Find the nondecreasing subsequences

    # 题目大意 就是找不下降子序列的个数. # 解题思路 一开始想着先离散化,然后再做个 $dp$,发现用 $dp$ 的话时间复杂度是 $\text{O}(n^2)$ 的,稳稳超时. 这里说说 $dp$ ...

  3. MySQL 8.0.12 基于Windows 安装教程

    第一步:到MySQL官网下载安装包:https://dev.mysql.com/downloads/mysql/ 第二步:将下载好的安装包(mysql-8.0.12-winx64 .zip)解压到相应 ...

  4. unittest多线程生成报告(BeautifulReport)

    前言 selenium多线程跑用例,这个前面一篇已经解决了,如何生成一个测试报告这个是难点,刚好在github上有个大神分享了BeautifulReport,完美的结合起来,就能生成报告了. 环境必备 ...

  5. 大数据学习——hive使用

    Hive交互shell bin/hive Hive JDBC服务 hive也可以启动为一个服务器,来对外提供 启动方式,(假如是在itcast01上): 启动为前台:bin/hiveserver2 启 ...

  6. XV6第一个进程

    第一个进程 本章通过第一个进程的创建来解释 xv6 是如何开始运行的,让我们得以一窥 xv6 提供的各个抽象是如何实现和交互的.xv6 尽量复用了普通操作的代码来建立第一个进程,避免单独为其撰写代码. ...

  7. OSPF选路原则

    1:O路由>Oia路由>external路由! O:计算LSA-1和LSA-2,前提age不能MaxAge,metric不能LSinfinity,计算出来的最小metric的路由放入RIB ...

  8. SPOJ LCS2 多个串的最长公共子串

    这里串最多有10个,找所有串的最长公共子串 这里后缀自动机做,以第一个串建立后缀自动机,后面的串一个个去匹配,每次得到当前串在可到达状态上所能得到的最长后缀长度 拿所有串匹配后得到的结果进行计算 #i ...

  9. POJ 1300 最基础的欧拉回路问题

    题目大意: 从0~n-1编号的房间,从一个起点开始最后到达0号房间,每经过一扇门就关上,问最后能否通过所有门且到达0号房间 我觉得这道题的输入输出格式是我第一次遇到,所以在sscanf上也看了很久 每 ...

  10. 【dfs+理解题意+构造】【待重做】codeforces E. Ice cream coloring

    http://codeforces.com/contest/805/problem/E [题意] 染色数是很好确定,最少染色数是max(si)(最小为1,即使所有的si都为0,这样是单节点树形成的森林 ...