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

先看类图:

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为组合中的对象声明接口,实现全部类共同拥有接口的默认行为。

  1. package composite;
  2.  
  3. import java.util.*; //加入引用
  4.  
  5. public abstract class AbstractFile {
  6. protected String name; // 定义name字段
  7.  
  8. public void printName() {
  9. System.out.println(name);
  10. }
  11.  
  12. // 通常都用add和remove方法来提供添加或移除树叶或树枝的功能
  13. public abstract boolean addChild(AbstractFile file); // 添加
  14.  
  15. public abstract boolean removeChild(AbstractFile file); // 移除
  16. // 一个集合,存放摘要文件的子文件的对象
  17.  
  18. public abstract List<AbstractFile> getChildren();
  19. }

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

  1. package composite;
  2.  
  3. import java.util.*;
  4.  
  5. public class File extends AbstractFile {
  6. public File(String name) {
  7. this.name = name;
  8. }
  9. //文件并没有加入的能力,它仅仅是一个单独的个体
  10. public boolean addChild(AbstractFile file) {
  11. return false;
  12. }
  13. //对于文件本身,已经是叶子节点了。所以也无删除子文件的功能
  14. public boolean removeChild(AbstractFile file) {
  15. return false;
  16. }
  17.  
  18. // 因为File已经是叶子节点了。所以就不存在集合这一说,所以这种方法返回的是空值
  19. public List<AbstractFile> getChildren() {
  20. return null;
  21. }
  22. }

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

  1. package composite;
  2.  
  3. import java.util.*;
  4.  
  5. public class Folder extends AbstractFile {
  6.  
  7. private List<AbstractFile> childList ;
  8.  
  9. public Folder(String name) {
  10. this.name = name;
  11. //用来建立一个集合保存子文件
  12. this.childList = new ArrayList<AbstractFile>();
  13. }
  14. //加入子文件
  15. public boolean addChild(AbstractFile file) {
  16. return childList.add(file);
  17. }
  18. //删除子文件
  19. public boolean removeChild(AbstractFile file) {
  20. return childList.remove(file);
  21. }
  22.  
  23. // 子类的返回类型应该和父类的定义保持一致
  24. public List<AbstractFile> getChildren() {
  25. return childList;
  26. }
  27.  
  28. }

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

  1. package composite;
  2.  
  3. import java.util.List;
  4.  
  5. public class Client {
  6. public static void main(String[] args) {
  7. // TODO 自己主动生成的方法存根
  8. // 构造一个树形的文件、文件夹结构
  9. AbstractFile rootFolder = new Folder("c:\\");
  10. AbstractFile compositeFolder = new Folder("composite");
  11. AbstractFile windowsFolder = new Folder("windows");
  12. AbstractFile file = new File("TestComposite.java");
  13.  
  14. rootFolder.addChild(compositeFolder);
  15. rootFolder.addChild(windowsFolder);
  16. compositeFolder.addChild(file);
  17. // 打印文件夹文件树
  18. printTree(rootFolder);
  19. }
  20.  
  21. private static void printTree(AbstractFile ifile) {
  22. ifile.printName();
  23. List<AbstractFile> children = ifile.getChildren();
  24. if (children == null)
  25. return;
  26. for (AbstractFile file : children) {
  27. printTree(file); // 打印方法的调用
  28. }
  29. }
  30. }

透明方式与安全方式

在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. 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?

    1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...

  2. Linux离线安装redis集群

    一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,联网环境安装较为简单,这里只说脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网,服务 ...

  3. 第三讲:post-processsing with vcs+ files

    1,dump wave  by system function $vcdpluson(level_number,module_instance,....|net_or_reg) $vcdplusoff ...

  4. 给Django中的url起名字

    url反转  =>reverse 1.from django.shortcuts  import  reverse 2. 利用reverse函数对URL名称进行反转  reverse(url名称 ...

  5. SSM整合shiro

    采用maven构建项目 1pom.xml中加入shiro依赖 <!-- shiro --> <dependency> <groupId>org.apache.shi ...

  6. centos7 ftp 500 OOPS: cannot change directory:/var/ftp/xutong/

    在设置多用户登录的时候 该指定的用户xutong对于上级目录/var/ftp 没有访问权限 修改一下上级目录的权限 chmod /var/ftp 对于ftp多用户访问的配置修改也做一个记录 以是设置F ...

  7. FZU- Problem 1147 Tiling,递推坑题,大数水过~~

    Problem 1147 Tiling Time Limit: 1000 mSec Memory Limit : 32768 KB http://acm.fzu.edu.cn/problem.php? ...

  8. 『NYIST』第九届河南省ACM竞赛队伍选拔赛[正式赛二]- Nearly Lucky Number(Codeforces Beta Round #84 (Div. 2 Only)A. Nearly)

    A. Nearly Lucky Number time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  9. FZU-2148-Moon Game,,几何计算~~

    Problem 2148 Moon Game Time Limit: 1000 mSec Memory Limit : 32768 KB  Problem Description Fat brothe ...

  10. 【转】关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)

    讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说你的理解有点片面,那么到底什么 ...