目录

一、组合模式

二、实现

三、优缺点

四、适用环境

五、小结


一、组合模式

组合模式:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式可以让客户端统一对待单个对象和组合对象(结构型)。

组合模式角色:

  • 抽象构件:可以是接口,也可以是抽象类;
  • 叶子构件:它在组合构件中表示叶子节点对象,叶子节点没有子节点,实现了抽象构建中的定义的方法;
  • 容器构件:包含子节点,子节点可以是叶子节点,也可以是容器节点。

二、实现

在src目录下,新建一个composite文件夹,在该文件夹下新建一个composite.cj文件和composite.drawio文件。

类图

核心代码

package DesignPattern.composite
import std.collection.*
 
// 抽象构件类
public abstract class Composite {
    public func create(): Unit
}
 
// 容器构件类
public class Window <: Composite {
    private let composites: ArrayList<Composite> = ArrayList<Composite>()
    public Window(private let name: String) {}
 
    public override func create() {
        println("在${this.name}里创建:")
        for(composite in composites) {
            composite.create()
        }
    }
 
    public func add(composite: Composite) {
        composites.add(composite)
    }
 
    public func remove(index: Int64) {
        composites.remove(at: index)
    }
 
    public func getChild(index: Int64): Composite {
        return composites[index]
    }
}
 
// 叶子构件
public class Text <: Composite {
    public override func create() {
        println("文本组件")
    }
}
 
public class Button <: Composite {
    public override func create() {
        println("按钮组件")
    }
}

测试代码

package DesignPattern
import DesignPattern.composite.*

main(): Int64 {
    let window = Window("画板1")
    window.add(Text())
    window.add(Button())
    window.add(Text())
    window.add(Button())
    window.create()

    return 0
}

三、优缺点

优点:

  • 可以清楚的定义分层次的复杂对象,让客户端忽略了层次的差异;
  • 客户端可以一致地适用一个组合结构或其中单个对象,简化了客户端代码;
  • 在组合模式中新增容器构件和叶子构件很方便,无需修改源代码,符合开闭原则;
  • 为树形结构的面向对象实现提供了一种灵活的解决方案。

缺点:

  • 在新增构件时,很难对容器中的构件类型进行限制。

四、适用环境

  • 在具有整体和部分的层次结构中希望通过一种方式忽略整体与部分的差异;
  • 在需要使用面向对象语言开发树型结构的系统时。

五、小结

本章为大家详细的介绍了仓颉设计模式中组合模式的内容,下一章,为大家带来组合模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐