• 设计模式:组合模式


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

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

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

    组件

    组合模式包含以下组件:

    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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在上述示例中,我们定义了抽象组件接口(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能够更好地组织和管理各种组件和对象,提供更灵活、可扩展的框架功能。

    总结

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

  • 相关阅读:
    【项目管理】beautyeye
    JS数组中删除另一个数组
    购买链接服务后使用记录
    【影刀演示_发送邮件的格式化HTML留存】
    AWS认证SAA-C03每日一题
    flask后端进行yolov5检测模型的部署(填坑)
    SpringBoot实战笔记:记一次接口406错误的解决
    Swagger之学习使用
    LabVIEW性能和内存管理 4
    从零开始搭建前端脚手架(三)-- [动态添加、删除模板]
  • 原文地址:https://blog.csdn.net/qq_27586963/article/details/132945534