1、Composite模式定义

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

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.

2、示例代码

类图:

类的一览表

定义Entry类

package cn.design.structured.compposite;

/**
* @author lin
* @version 1.0
* @date 2020-07-23 17:04
* @Description TODO
*/
public abstract class Entry {
   /**
    * 获取名字
    *
    * @return String
    */
   public abstract String getName();    /**
    * 获取大小
    *
    * @return int
    */
   public abstract int getSize();    /**
    * 加入目录条目
    *
    * @param entry 入参
    * @return 返回
    */
   public Entry add(Entry entry) {
       throw new FileTreatmentException();
  }    public void printList() {            // 显示目录条目
       printList("");
  }    protected abstract void printList(String prefix);  // 显示条目前缀    @Override
   public String toString() {
       return getName() + "(" + getSize() + ")";
  }
}

定义FileTreatmentException类

package cn.design.structured.compposite;

/**
* @author lin
* @version 1.0
* @date 2020-07-23 17:06
* @Description TODO
*/
public class FileTreatmentException extends RuntimeException {
   public FileTreatmentException() {
  }    public FileTreatmentException(String message) {
       super(message);
  } }

定义File类

package cn.design.structured.compposite;

/**
* @author lin
* @version 1.0
* @date 2020-07-23 17:05
* @Description 文件类
*/
public class File extends Entry {
   private String name;
   private int size;    public File(String name, int size) {
       this.name = name;
       this.size = size;
  }    @Override
   public String getName() {
       return name;
  }    @Override
   public int getSize() {
       return size;
  }    @Override
   protected void printList(String prefix) {
       System.out.println(prefix + "/" + this);
  }
}

定义Directory类

package cn.design.structured.compposite;

import java.util.ArrayList;
import java.util.Iterator; /**
* @author lin
* @version 1.0
* @date 2020-07-23 17:05
* @Description TODO
*/
public class Directory extends Entry {    private final String name;
   private final ArrayList<Entry> directory = new ArrayList<>();    public Directory(String name) {
       this.name = name;
  }    @Override
   public String getName() {
       return name;
  }    @Override
   public int getSize() {
       int size = 0;
       for (Entry entry : directory) {
           size += entry.getSize();
      }
       return size;
  }    @Override
   protected void printList(String prefix) {
       System.out.println(prefix + "/" + this);
       for (Entry entry : directory) {
           entry.printList(prefix + "/" + name);
      }
  }    @Override
   public Entry add(Entry entry) {
       directory.add(entry);
       return this;
  }
}

定义CompositeMain测试类

package cn.design.structured.compposite;

/**
* @author lin
* @version 1.0
* @date 2020-07-23 16:40
* @Description TODO
*/
public class CompositeMain {
   public static void main(String[] args) {
       try {
           System.out.println("Making root entries............");
           Entry rooter = new Directory("root");
           Entry binder = new Directory("bin");
           Entry teador = new Directory("tmp");
           Entry under = new Directory("usr");
           rooter.add(binder);
           rooter.add(teador);
           rooter.add(under);
           binder.add(new File("yi", 1000));
           binder.add(new File("latex", 200000));            System.out.println("");
           System.out.println("Making user entries......");
           Entry yuki = new Directory("yuki");
           Entry hanako = new Directory("tomura");
           Entry tomuura = new Directory("tomura");
           under.add(yuki);
           under.add(hanako);
           under.add(tomuura);
           yuki.add(new File("diary.html", 1000));
           rooter.printList();
      } catch (Exception e) {
           System.err.println();
      }
  }
}

运行结果如下:

Making root entries............

Making user entries......
/root(202000)
/root/bin(201000)
/root/bin/yi(1000)
/root/bin/latex(200000)
/root/tmp(0)
/root/usr(1000)
/root/usr/yuki(1000)
/root/usr/yuki/diary.html(1000)
/root/usr/tomura(0)
/root/usr/tomura(0)
与目标VM断开连接, 地址为: ''127.0.0.1:54150', transport: '套接字'', 传输: '{1}' Process finished with exit code 0

3、深入了解

复合模式类图

角色分工

◆Leaf(树叶)

表示“内容”的角色。在该角色中不能放入其他对象。在示例程序中,由File类扮演此角色。

◆Composite (复合物)

表示容器的角色。可以在其中放入Leaf角色和Composite角色。在示例程序中,由Di rectory类扮演此角色。

◆Component

使Leaf角色和Composite角色具有-致性的角色。Composite 角色是Leaf角色和Composite角色的父类。在示例程序中,由Entry类扮演此角色。

◆Client

使用Composite模式的角色。在示例程序中,由Main类扮演此角色。Composite模式的类图如图11-3 所示。在该图中,可以将Composite角色与它内部的Component角色(即Leaf角色或Composite角色)看成是父亲与孩子们的关系。getChild方法的作用是从Component角色获取这些“孩子们”。

4、小结

Composite比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。

意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

优点: 1、高层模块调用简单。2、节点自由增加。

缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

注意事项:定义时为具体类。

公众号:发哥讲

这是一个稍偏基础和偏技术的公众号,甚至其中包括一些可能阅读量很低的包含代码的技术文,不知道你是不是喜欢,期待你的关注。

如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~

● 扫码关注我们

11、Composite 组合模式 容器与内容的一致性(抽象化) 结构型设计模式的更多相关文章

  1. 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式

    1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...

  2. 设计模式(九):Composite组合模式 -- 结构型模式

    1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对 ...

  3. 一天一个设计模式——Composite组合模式

    一.模式说明 能够使容器与内容物具有一致性,创造出递归结构的模式就是Composite组合模式. 举个例子:计算机中的文件系统中有文件和文件夹的概念,我们知道,文件夹可以包含文件,也可以包含子文件夹, ...

  4. Composite组合模式(结构型模式)

    1.概述 在面向对象系统中,经常会遇到一些具有"容器性质"的对象,它们自己在充当容器的同时,也充当其他对象的容器. 2.案例 需要构建一个容器系统,需要满足以下几点要求: (1). ...

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

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

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

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

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

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

  8. 十一、Composite 组合模式

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

  9. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

随机推荐

  1. 爬虫前篇 /https协议原理剖析

    爬虫前篇 /https协议原理剖析 目录 爬虫前篇 /https协议原理剖析 1. http协议是不安全的 2. 使用对称秘钥进行数据加密 3. 动态对称秘钥和非对称秘钥 4. CA证书的应用 5. ...

  2. 用Python演奏音乐

    目录 背景 准备 安装mingus 下载并配置fluidsynth 下载soundfont文件 分析 乐谱格式 乐谱解析 弹奏音乐 添加伴奏 保存音乐 完整程序 背景 笔者什么乐器也不会,乐理知识也只 ...

  3. 03 AMD规范的基础使用详解

    AMD模块规范 1.1 AMD规范说明 AMD规范专门用来实现浏览器端的模块化,并且模块的加载是异步的:引入一个第三方的require.js脚本用来解析AMD规范编写的模块 1.2 基本语法 使用de ...

  4. Java实现简单的增删改查操作

    需求分析:通过数组 ,完成 对学生信息的 管理 (增删改查)创建1个 学生类创建1个 CRUD的类 – 学生管理类 并测试 在这个程序中我只运用了两个类进行操作 package com.hopu.de ...

  5. NCRE-Python考点

    NCRE-Python考点 作者:封亚飞本文不含 文件处理.面向对象程序设计.公共基础.计算生态希望各位可以批评指正Qq 64761294 由于图片上传不方便,需要真题的朋友可以加我的qq找我要pdf ...

  6. DC-1靶机实战和分析

    前言 我们都知道,对靶机的渗透,可以宽阔自己的解题思路,练习并熟悉相关操作命令,提高自己的能力.下面我就对Vulnhub的DC-1靶机进行渗透,靶机设置了5个flag,咱们依次找到它.并通过图文形式讲 ...

  7. windy数(数位dp)

    https://www.luogu.com.cn/blog/virus2017/shuweidp https://www.luogu.com.cn/problem/P2657 #include < ...

  8. anaconda一站式环境的搭建(anaconda、tensorflow、opencv)

    搭建人工智能图像处理环境 Anaconda一站式开发环境搭建. 工欲善其事必先利其器,在我们学习之前,我们先要搭建一个属于我们自己的开发环境.我们开发的环境是有anaconda.testflow.op ...

  9. 【IDEA】HTML通过servlet3.0注解名提交表单到servlet类找不到页面的问题

    IDEA一时爽,摸不着头的BUG火葬场 这个问题困扰我整整一天一夜,先是代码检查路径设置找不出问题,后面换tomcat版不行,抱着侥幸心理换IDEA版本意料之中还是没解决问题. 都快想秃了最后终于完美 ...

  10. MacOS下JDK8的安装与配置

    微信搜索"艺术行者",关注并回复关键词"jdk8"获取安装包和API文档资料! 一.安装环节 1.打开网页 https://www.oracle.com/jav ...