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

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

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
}

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

总结

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

相关推荐
DemonAvenger11 小时前
深入Go并发编程:Goroutine性能调优与实战技巧全解析
设计模式·架构·go
啾啾Fun12 小时前
[Java基础-线程篇]7_线程设计模式与总结
java·开发语言·设计模式
Dontla14 小时前
C++设计模式总结
开发语言·c++·设计模式
JuicyActiveGilbert14 小时前
【C++设计模式】第十篇:外观模式(Facade)
c++·设计模式·外观模式
yuanpan14 小时前
23种设计模式之《装饰器模式(Decorator)》在c#中的应用及理解
设计模式·c#·装饰器模式
程序员云帆哥14 小时前
【玩转23种Java设计模式】结构型模式篇:组合模式
java·设计模式·组合模式
techzhi14 小时前
设计模式-原型模式
设计模式·原型模式
JuicyActiveGilbert15 小时前
【C++设计模式】第八篇:组合模式(Composite)
c++·设计模式·组合模式
诗水人间18 小时前
设计模式 + java8方法引用 实现任意表的过滤器
设计模式
烟锁池塘柳018 小时前
Pipeline模式详解:提升程序处理效率的设计模式
人工智能·深度学习·设计模式