设计模式:组合模式

2023-09-17 16:16:27

组合模式是一种结构型设计模式,用于将对象组织成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,而不需要区分它们之间的差异。

在组合模式中,有两种主要类型的对象:叶节点和组合节点。叶节点表示树结构中的最小单位,它们没有子节点。而组合节点则可以包含其他子节点,形成更大的组合对象。

通过使用组合模式,可以轻松地构建具有层次结构的对象,并对整个层次结构进行统一的操作。这种模式常用于处理树形数据结构,例如文件系统、菜单、组织结构等。

组件

组合模式包含以下组件:

  1. 抽象组件(Component):定义组合对象和叶节点对象的共同行为,并为其提供默认实现。
  2. 叶节点(Leaf):表示树结构中的最小单位,没有子节点。实现抽象组件的方法,并定义叶节点特定的行为。
  3. 组合节点(Composite):表示可以包含其他子节点的组合对象。实现抽象组件的方法,并管理子节点的增加、删除和遍历等操作。

这些组件共同协作,形成了具有层次结构的组合模式。通过组合模式,可以将对象以树形结构组织起来,使得客户端可以统一地处理单个对象和组合对象,而无需区分它们之间的差异。

代码实现

interface Component {
    void operation();
}
 // 叶节点
class Leaf implements Component {
    @Override
    public void operation() {
        System.out.println("执行叶节点操作");
    }
}
 // 组合节点
class Composite implements Component {
    private List<Component> components = new ArrayList<>();
     public void add(Component component) {
        components.add(component);
    }
     public void remove(Component component) {
        components.remove(component);
    }
     @Override
    public void operation() {
        System.out.println("执行组合节点操作");
        for (Component component : components) {
            component.operation();
        }
    }
}
 // 示例代码
public class Main {
    public static void main(String[] args) {
        // 创建组合节点
        Composite composite = new Composite();
         // 创建叶节点
        Leaf leaf1 = new Leaf();
        Leaf leaf2 = new Leaf();
         // 添加叶节点到组合节点
        composite.add(leaf1);
        composite.add(leaf2);
         // 执行操作
        composite.operation();
    }
}

在上述示例中,我们定义了抽象组件接口(Component),并实现了叶节点(Leaf)和组合节点(Composite)。组合节点可以包含其他子节点,并在执行操作时递归调用其子节点的操作。在主函数中,我们创建了一个组合节点,并添加了两个叶节点到组合节点中,最后执行了组合节点的操作。

优缺点

组合模式的优点:

  1. 简化客户端代码:组合模式使得客户端可以统一地处理单个对象和组合对象,而无需区分它们之间的差异,从而简化了客户端代码。
  2. 可以灵活地添加、删除和修改对象:由于组合模式使用了统一的接口,可以方便地添加、删除和修改组合对象的子节点,而不会影响到客户端的代码。
  3. 提高代码复用性:组合模式通过将对象组织成树形结构,可以更好地复用已有的代码,避免了重复编写相似的代码。

组合模式的缺点:

  1. 组合模式可能会导致系统过于复杂:当组合对象的层次结构过于复杂时,可能会导致系统难以理解和维护。
  2. 不适合所有场景:组合模式更适用于表示层次结构的场景,不适用于所有类型的系统设计。

源码中应用

在Spring源码中,组合模式有许多应用场景。以下是其中一些示例:

  1. ApplicationContext的层次结构:Spring的ApplicationContext容器可以以树形结构组织,支持父子容器的关系。这种层次结构的组织方式就是使用了组合模式,可以方便地管理和访问不同级别的ApplicationContext。
  2. Bean的依赖注入:Spring的依赖注入机制也可以使用组合模式。通过将依赖关系组织成树形结构,容器可以自动注入依赖对象,并实现对象之间的解耦。
  3. AOP切面的层次结构:Spring的AOP切面也可以使用组合模式来表示层次结构。切面可以包含其他切面或切点,形成更复杂的切面结构,从而实现更灵活的切面编程。
  4. Bean的嵌套结构:在Spring中,可以将一个Bean定义嵌套在另一个Bean定义中,形成组合对象。这样可以方便地管理和访问嵌套的Bean对象,实现更复杂的业务逻辑。
    这些是组合模式在Spring源码中的一些常见应用场景。通过使用组合模式,Spring能够更好地组织和管理各种组件和对象,提供更灵活、可扩展的框架功能。

总结

需要根据具体的应用场景和需求来评估组合模式的适用性,以确定是否使用该设计模式。

更多推荐

【大数据之Kafka】十五、Kafka-Kraft模式

1Kafka-Kraft架构左图为Kafka现有架构,元数据在zookeeper中,运行时动态选举controller,由controller进行Kafka集群管理。右图为kraft模式架构(实验性),不再依赖zookeeper集群,而是用三台controller节点代替zookeeper,元数据保存在controll

Python —— excel文件操作(超详细)

背景很多公司还是用excel去管理测试用例的,所以为了减少重复繁琐的导出导出工作,学会如何用代码操作excel表格很实用~1、读取excel文件基本步骤1、操作excel的一些库1、xlrd:读取库,xlwt:写入,现在基本不用,因为只能处理.xls这种格式的数据2、使用openpyxl库:不支持的.xls格式,支持的

Vue.js基础语法下

🎬艳艳耶✌️:个人主页🔥个人专栏:《Spring与Mybatis集成整合》《springMvc使用》⛺️生活的理想,为了不断更新自己!1、事件处理器1.1.概述在Vue中,事件处理器是用来处理DOM事件的方法。它可以在Vue组件中定义和使用,用于响应用户的交互操作。事件处理器的作用是监听DOM事件,并在事件触发时执

C++真的是 C加加

📝个人主页:夏目浅石.📌博客专栏:C++的故事🏠学习社区:夏目友人帐.文章目录前言Ⅰ.函数重载0x00重载规则0x01函数重载的原理名字修饰Ⅱ.引用0x00引用的概念0x01引用和指针区分0x03引用的本质0x04引用的特性0x05引用的使用场景0x06常引用0x07指针和引用区别Ⅲ.结语前言亲爱的夏目友人帐的小

mysql 双主复制_配置步骤、遇到的问题及解决办法

MySQL主主复制结构区别于主从复制结构。在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上,这样两台服务器互为主从,并且都能向外提供服务。配置步骤:一、修改配置文件(一)服务器A(192.168.115.119)配置如下(该配置需要写到[mysqld]区域内)server-id=1

PY32F003F18之通用定时器MspInit函数

PY32F003F18高级定时器有TIM1,通用定时器有TIM3,TIM14,TIM16和TIM17。在初始化定时器前,要先写好MspInit函数,才可以调用与之对应的初始化函数。1、TIM1更新事件的MspInit函数//函数功能:在初始化定时器时,HAL库使用该函数//使能TIMx时钟,设置中断优先级,使能TIMx

Spring MVC里的DispatchServlet(结合Spring官网翻译)

SpringMVC里的DispatchServlet前言1.SpringWebMVC1.1DispatcherServlet(中央调度器)1.1.1ContextHierarchy(上下文层次结构)1.1.2SpecialBeanTypes(特定的bean类型)1.1.3WebMVCConfig1.1.4Servlet

MyBatis特殊SQL的执行(模糊查询、批量删除、动态设置表名、添加功能获取自增的主键)

一、模糊查询1.1like'%${xxx}%'的方式模糊查询/***根据用户名进行模糊查询*@paramusername*@returnjava.util.List<com.atguigu.mybatis.pojo.User>*/List<User>getUserByLike(@Param("username")Str

竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录0前言1课题描述2实现效果3算法实现原理3.1数据集3.2深度学习识别算法3.3特征提取主干网络3.4总体实现流程4具体实现4.1预训练数据格式4.2部分实现代码5最后0前言🔥优质竞赛项目系列,今天要分享的是🚩毕业设计人脸性别年龄识别系统-图像识别opencv该项目较为新颖,适合作为竞赛课题方向,学长非常推

FPGA-结合协议时序实现UART收发器(三):串口接收模块uart_rx

FPGA-结合协议时序实现UART收发器(三):串口接收模块uart_rx串口接收模块uart_rx的功能实现文章目录FPGA-结合协议时序实现UART收发器(三):串口接收模块uart_rx一、功能实现二、uart_rx代码总结一、功能实现对照代码,串口接收模块uart_rx实现功能包括:r_cnt计数信号,计数数据

DMNet复现(一)之数据准备篇:Density map guided object detection in aerial image

一、生成密度图密度图标签生成采用以下代码,生成训练集密度图gt:importcv2importglobimporth5pyimportscipyimportpickleimportnumpyasnpfromPILimportImagefromitertoolsimportislicefromtqdmimporttqdm

热文推荐