重修设计模式-结构型-组合模式

重修设计模式-结构型-组合模式

Compose objects into tree structure to represent part-whole hierarchies.Composite lets client treat individual objects and compositions of objects uniformly.

将一组对象组织成树形结构,来表示一种"部分 - 整体"的层次结构。组合让客户端可以统一单个对象和组合对象的处理逻辑。

组合模式(Composite Pattern)也叫部分-整体模式(Part-Whole), 用来描述部分与整体的关系,主要是用于处理树形结构数据。

组合模式的三个角色

  1. 组件抽象接口(Component)

    定义一些参加组合对象的通用行为或属性。

  2. 叶子节点(Leaf)

    表示叶子节点对象,下面没有其他分支,是遍历的最小单位。

  3. 组合节点(Composite)

    表示有子节点的对象,作用是组合树枝节点和叶子节点形成一个树形结构。

举个例子,在程序中表示下图的公司组织架构,并可计算总薪资情况:

其中员工是叶子节点;部门是组合节点,包含子部门和员工,是一种嵌套结构,可以表示成树这种数据结构。计算每个部门的薪资开支这样一个需求,也可以通过在树上的遍历算法来实现。用组合模式实现如下:

kotlin 复制代码
//组件抽象接口
abstract class CompanyInfo(val name: String) {
    abstract fun calculateSalary(): Double
}

//组合节点
class Department(name: String): CompanyInfo(name) {
    private val mHumanList = mutableListOf<CompanyInfo>()
    override fun calculateSalary(): Double {
        return mHumanList.sumOf { it.calculateSalary() }  //部门薪资是所有子节点的薪资总和
    }

    fun addNode(info: CompanyInfo) {
    }

    fun removeNode(name: String) {
    }
}

//叶子节点
class Employee(name: String, private val salary: Double) : CompanyInfo(name) {
    override fun calculateSalary(): Double {
        return salary	//员工薪资就是自己的
    }
}

调用处:

kotlin 复制代码
fun main() {
    val root = buildCompany()  //只需处理CompanyInfo类型,不关心子类型
    val totalSalary = root.calculateSalary()
    println("${root.name}总薪资:${totalSalary}")
}

fun buildCompany(): CompanyInfo {
    val rootCompany = Department("技术有限公司")
    val department1 = Department("研发部")
    department1.addNode(Employee("老大", 2000.0))
    department1.addNode(Employee("老三", 1500.0))
    department1.addNode(Employee("老六", 1000.0))
    rootCompany.addNode(department1)
    val department2 = Department("行政部")
    department2.addNode(Employee("大美", 3000.0))
    department2.addNode(Employee("小丽", 2500.0))
    department2.addNode(Employee("小舞", 2000.0))
    val childDepartment = Department("法务部")
    childDepartment.addNode(Employee("硬币", 10000.0))
    department2.addNode(childDepartment)
    rootCompany.addNode(department2)
    return rootCompany
}

调用时可以一致地使用组合或单个对象,不需要区分叶子节点还是组合节点。并且增加新的组合对象很容易,只需要实现组件抽象接口,不需要修改原有代码,这就是组合模式的特点。

总结

组合模式的设计思路,更像对业务场景的一种数据结构和算法的抽象。其中,数据可以表示成树这种数据结构,业务需求可以通过在树上的递归遍历算法来实现。使用组合模式的前提在于,业务场景必须能够表示成树形结构。所以组合模式的应用场景也比较局限,并不是一种很常用的设计模式。

相关推荐
geovindu34 分钟前
CSharp: Prototype Pattern
开发语言·后端·设计模式·.net·原型模式·创建型模式
ttod_qzstudio1 小时前
【软考设计模式】组合模式:“部分-整体“层次结构与树形对象统一操作精讲
设计模式·组合模式
ttod_qzstudio3 小时前
【软考设计模式】装饰模式:“套娃“式增强与动态职责扩展精讲
设计模式·装饰模式
烬羽4 小时前
MCP 多服务器架构实战:一个 Agent 同时操控地图、浏览器和文件
设计模式·设计
阿pin7 小时前
Android随笔-常用的设计模式
android·设计模式
儒雅的名7 小时前
GoF设计模式——策略模式
设计模式·bash·策略模式
折哥的程序人生 · 物流技术专研16 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
jsonbro1 天前
手把手带你实现发布订阅模式
前端·vue.js·设计模式
workflower1 天前
室内外配送机器人-应用路径
人工智能·机器学习·设计模式·矩阵·自动化
ttod_qzstudio1 天前
【软考设计模式】原型模式:“克隆“对象与深拷贝、浅拷贝精讲
设计模式·原型模式