Composite-组合 ############## .. note:: composes zero-or-more similar objects so that they can be manipulated as one object. Compose objects into tree structure to represent part-whole hierarchies.Composite lets client treat individual objects and compositions of objects uniformly.组合模式跟我们之前讲的面向对象设计中的 “组合关系(通过组合来组装两个类)”,完全是两码事。这里讲的 “组合模式”,主要是用来处理树形结构数据。 .. note:: 组合模式的设计思路,与其说是一种设计模式,倒不如说是对业务场景的一种数据结构和算法的抽象。其中,数据可以表示成树这种数据结构,业务需求可以通过在树上的递归遍历算法来实现。 .. image:: https://img.zhaoweiguo.com/knowledge/images/architectures/design-modes/Structurals/Composite1.png Go 实现组合模式的方式有两种,分别是:: 1. 直接组合(Direct Composition) 类似于 Java/C++,就是将一个对象作为另一个对象的成员属性。 2. 嵌入组合(Embedding Composition) 场景举例 ======== 例一:: 需求:设计一个类来表示文件系统中的目录: 1. 动态地添加、删除某个目录下的子目录或文件; 2. 统计指定目录下的文件个数; 3. 统计指定目录下的文件总大小 分析: 对于文件,我们直接返回文件的个数(返回 1)或大小。 对于目录,我们遍历目录中每个子目录或者文件,递归计算它们的个数或大小,然后求和 实现: FileSystemNode是File 和 Directory 两个类的父类 .. note:: 【重新定义】将一组对象(文件和目录)组织成树形结构,以表示一种‘部分 - 整体’的层次结构(目录与子目录的嵌套结构)。组合模式让客户端可以统一单个对象(文件)和组合对象(目录)的处理逻辑(递归遍历) 例二:: 1. 基本描述 OA 系统(办公自动化系统)。 公司的组织结构包含部门和员工两种数据类型。其中,部门又可以包含子部门和员工 2. 需求 构建整个公司的人员架构图(部门、子部门、员工的隶属关系), 并且提供接口计算出部门的薪资成本(隶属于这个部门的所有员工的薪资和)。 3. 分析 部门包含子部门和员工,这是一种嵌套结构,可以表示成树这种数据结构。 计算每个部门的薪资开支这样一个需求,也可以通过在树上的遍历算法来实现 可以使用组合模式来设计和实现 4. 实现 HumanResource 是部门类(Department)和员工类(Employee)抽象出来的父类 目的是能统一薪资的处理逻辑 .. note:: 将一组对象(员工和部门)组织成树形结构,以表示一种‘部分 - 整体’的层次结构(部门与子部门的嵌套结构)。组合模式让客户端可以统一单个对象(员工)和组合对象(部门)的处理逻辑(递归遍历)。