主页

索引

模块索引

搜索页面

Composite-组合

备注

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.组合模式跟我们之前讲的面向对象设计中的 “组合关系(通过组合来组装两个类)”,完全是两码事。这里讲的 “组合模式”,主要是用来处理树形结构数据。

备注

组合模式的设计思路,与其说是一种设计模式,倒不如说是对业务场景的一种数据结构和算法的抽象。其中,数据可以表示成树这种数据结构,业务需求可以通过在树上的递归遍历算法来实现。

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 两个类的父类

备注

【重新定义】将一组对象(文件和目录)组织成树形结构,以表示一种‘部分 - 整体’的层次结构(目录与子目录的嵌套结构)。组合模式让客户端可以统一单个对象(文件)和组合对象(目录)的处理逻辑(递归遍历)

例二:

1. 基本描述
OA 系统(办公自动化系统)。
公司的组织结构包含部门和员工两种数据类型。其中,部门又可以包含子部门和员工

2. 需求
构建整个公司的人员架构图(部门、子部门、员工的隶属关系),
并且提供接口计算出部门的薪资成本(隶属于这个部门的所有员工的薪资和)。

3. 分析
部门包含子部门和员工,这是一种嵌套结构,可以表示成树这种数据结构。
计算每个部门的薪资开支这样一个需求,也可以通过在树上的遍历算法来实现
可以使用组合模式来设计和实现

4. 实现
HumanResource 是部门类(Department)和员工类(Employee)抽象出来的父类
目的是能统一薪资的处理逻辑

备注

将一组对象(员工和部门)组织成树形结构,以表示一种‘部分 - 整体’的层次结构(部门与子部门的嵌套结构)。组合模式让客户端可以统一单个对象(员工)和组合对象(部门)的处理逻辑(递归遍历)。

主页

索引

模块索引

搜索页面