当前位置: 首页 > article >正文

从家谱的层级结构 - 组合模式(Composite Pattern)

组合模式(Composite Pattern)

  • 组合模式(Composite Pattern)
    • 组合模式概述
    • 组合模式涉及的角色
    • talk is cheap, show you my code
    • 总结

组合模式(Composite Pattern)

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户代码可以统一地处理单个对象和对象组合,即无论是叶子节点还是包含其他组件的容器节点,都可以以相同的方式进行操作。

有点抽象
简单点说就是这种设计经常用于树形结构,为了简化代码,使用Composite可以把一个叶子节点与一个父节点统一起来处理。
在这里插入图片描述
比如家谱,我们就能明显看出层次结构。而且我们可以任意选一个人作为祖宗节点,这样选了任何一个人为祖宗的时候,都能拉出一份相似的层次结构。

组合模式概述

  1. 定义: 组合多个对象形成树状结构以表示“部分-整体”的层次结构。组合模式让客户端可以一致地使用单个对象和组合。
  2. 目的: 简化客户端代码对复杂层次结构的操作,同时保持良好的扩展性和灵活性。

组合模式涉及的角色

  1. Component(组件接口):定义组合中的对象的行为接口,声明一个公共接口用于访问及管理其子组件。可以是抽象类或接口。
  2. Leaf(叶对象):在组合中表示叶子节点对象,叶子节点没有子节点。
  3. Composite(组合对象):在组合中表示容器对象,可以包含子组件,并可以在子组件上执行组合操作。
    在这里插入图片描述

talk is cheap, show you my code

我们还是通过把我们举得那个案例转化成代码从而方便我们了解组合设计模式

  1. 组件(Component), 这个地方我们因为使用家谱信息,所以我们定义结构名为Family
public interface Family{
    // 所有组件都应实现的基本操作 我们这个案例主要指的是展示从自己开始的家族信息
    void show(); 
}
  1. 叶子(Leaf),这个地方指的是具体的一个个子Family
public class Afamily implements Family{
    @Override
    public void show() {
        System.out.println("Afamily");
    }
}
public class Bfamily implements Family{
    @Override
    public void show() {
        System.out.println("Bfamily");
    }
}
  1. 组合(Composite),代表树形结构中的非终端节点,它可以包含零个或多个子组件,因为组合也实现了对应的接口,所以组合不光可以加叶子节点,还可以把其他的组合添加到另一个组合中去。
public class FamilyComposite implements Family{
    private List<Family> children = new ArrayList<>();

    @Override
    public void show() {
        System.out.println("show my family");
        for (Family child : children) {
            child.show();
        }
    }

    public void add(Family family) {
        children.add(component);
    }

    public void remove(Family family) {
        children.remove(component);
    }

    public List<Family> getChildren() {
        return children;
    }
}

总结

组合模式优点:

  1. 一致性:客户端可以一致地对待单个对象和组合对象,不需要关心它们的具体类型。
  2. 灵活性:很容易通过组合模式构建复杂的树形结构,并且可以在不影响现有代码的情况下增加新的组件。
  3. 符合开闭原则:当需要添加新类型的组件时,只需创建一个新的叶子或组合类,而无需修改现有的代码。
  4. 易于扩展:由于每个组件都是独立的,因此可以很容易地为特定类型的组件添加新的行为或属性。

应用场景:

  • 文件系统:如操作系统中的目录和文件,其中目录可以包含其他目录或文件,而文件是终端节点。
  • 图形界面设计:例如窗口中的菜单项,菜单本身可能包含子菜单或具体的菜单选项(叶子)。
  • 组织架构:如公司内部的部门和员工,部门可以包含子部门或其他员工。
  • 文档编辑器:如文本块、段落、章节等,其中章节可以包含多个段落,段落又可以包含多个文本块。

组合模式是一个非常有用的设计模式,特别是在需要处理具有层次结构的数据时。它可以帮助开发者更好地组织代码,提高系统的灵活性和可扩展性。其实我们平时解析Xml的过程中,就有组合模式,因为Xml实际上也是一颗树结构。如果有兴趣的同学可以去阅读一下解析XML的库函数的源码。


http://www.kler.cn/a/461126.html

相关文章:

  • 高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程
  • Golang的代码质量分析工具
  • AcWing练习题:差
  • python生成、操作svg图片
  • 【Matlab算法】基于改进人工势场法的移动机器人路径规划研究(附MATLAB完整代码)
  • Springboot:后端接收数组形式参数
  • es单机安装脚本自动化
  • hive-sql 计算每年在校生人数
  • 写在2024的最后一天
  • 【浏览器】缓存
  • Android 检测设备是否 Root
  • 【数据结构】线性数据结构——栈
  • 本地部署Hello-Algo打造私人算法教练让算法学习告别网络限制
  • 解构大语言模型(LLM)
  • 如何免费解锁 IPhone 网络
  • 如何使用 ChatGPT Prompts 写学术论文?
  • 嵌入式单片机中SPI外设控制与实现
  • 网神SecFox运维安全管理与审计系统 /authService/login接口反序列化漏洞复现 [附POC]
  • Vue.js组件开发-实现多级菜单
  • want php学习笔记
  • 【mysql】linux安装mysql客户端
  • 计算机体系结构期末考试
  • PDF怎么压缩得又小又清晰?5种PDF压缩方法
  • WPF合并C1FlexGrid表格,根据多列的值进行合并
  • JavaWeb开发(二)IDEA创建Java Web项目并部署及目录结构
  • Applied Spatial Statistics(十三)带有空间平滑器的 GAM