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

【地铁上的设计模式】--结构型模式:组合模式

什么是组合模式

组合模式是一种结构型设计模式,将对象组合成树形结构,以表示部分整体的层次结构,让用户对单个对象和组合对象的使用具有一致性。
在组合模式中,抽象构件定义了一个统一的接口,用于管理所有对象,叶子节点和组合节点都实现了该接口。叶子节点表示单个对象,而组合节点表示包含其他节点的对象。组合模式通过递归组合实现了树形结构,使得用户在使用组合对象时无需关心具体节点的类型,可以像处理单个对象一样处理整个组合对象,从而简化了客户端代码。
组合模式适用于以下情况:需要表示部分整体层次结构的情况,希望用户可以忽略对象与组合对象之间的差异,统一地使用它们的情况,以及希望在不增加复杂性的情况下增加新类型的组件的情况。

如何实现组合模式

组合模式的实现步骤如下:

  1. 定义抽象组件(Component):组件是组合模式中最基础的部分,它定义了组合模式中所有对象的通用行为。
  2. 定义叶子组件(Leaf):叶子组件是组合模式中的基础部件,它实现了组件的通用行为,但不能包含其他组件。
  3. 定义容器组件(Composite):容器组件是由叶子组件和其他容器组件组成的复杂对象,它包含了组件的通用行为,同时可以包含其他组件。
  4. 组合构建:容器组件可以包含其他组件,这些组件可以是叶子组件,也可以是其他容器组件,从而构建出组合对象。
  5. 定义客户端(Client):客户端使用组件构建出的组合对象,对其进行操作和管理。

Java实现
以下是Java实现组合模式的示例代码:

import java.util.ArrayList;
import java.util.List;

interface Component {
    void show();
}

class Leaf implements Component {
    private String name;
    
    public Leaf(String name) {
        this.name = name;
    }

    @Override
    public void show() {
        System.out.println("Leaf: " + name);
    }
}

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 show() {
        for (Component component : components) {
            component.show();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Component root = new Composite();
        Component node1 = new Composite();
        Component node2 = new Composite();
        Component leaf1 = new Leaf("Leaf 1");
        Component leaf2 = new Leaf("Leaf 2");
        Component leaf3 = new Leaf("Leaf 3");
        Component leaf4 = new Leaf("Leaf 4");

        node1.add(leaf1);
        node1.add(leaf2);
        node2.add(leaf3);
        node2.add(leaf4);

        root.add(node1);
        root.add(node2);

        root.show();
    }
}

在这个示例中,我们定义了一个Component接口作为组件的基础,其中包含了一个show()方法。Leaf类是组合中的叶子节点,实现了Component接口,Composite类是组合中的容器节点,也实现了Component接口,其中包含了一个List来存储其子节点。在客户端代码中,我们创建了一棵树状结构,将叶子节点和容器节点按照一定的层次关系组合在一起,并调用根节点的show()方法来展示整个组合结构。

C#实现
以下是用 C# 实现组合模式的示例代码:

using System;
using System.Collections.Generic;

// Component
interface IComponent
{
    void Operation();
}

// Leaf
class Leaf : IComponent
{
    public void Operation()
    {
        Console.WriteLine("Leaf operation");
    }
}

// Composite
class Composite : IComponent
{
    private List<IComponent> components = new List<IComponent>();

    public void Add(IComponent component)
    {
        components.Add(component);
    }

    public void Remove(IComponent component)
    {
        components.Remove(component);
    }

    public void Operation()
    {
        Console.WriteLine("Composite operation");

        foreach (IComponent component in components)
        {
            component.Operation();
        }
    }
}

// Client
class Client
{
    static void Main(string[] args)
    {
        // Create leaf components
        IComponent leaf1 = new Leaf();
        IComponent leaf2 = new Leaf();
        IComponent leaf3 = new Leaf();

        // Create composite components
        Composite composite1 = new Composite();
        Composite composite2 = new Composite();

        // Add leaf components to composite1
        composite1.Add(leaf1);
        composite1.Add(leaf2);

        // Add leaf and composite components to composite2
        composite2.Add(leaf3);
        composite2.Add(composite1);

        // Call operation on composite2
        composite2.Operation();
    }
}

在这个示例代码中,IComponent 接口是组合模式的 Component,LeafComposite 分别是 Leaf 和 Composite,Client 是客户端代码。主要的实现在 Composite 类中,它包含了一个 List 来存储子组件,实现了 Add、Remove 和 Operation 方法。客户端代码创建了一些 Leaf 和 Composite 对象,并通过 Add 方法将它们组合起来,最后调用了 Composite 的 Operation 方法,实现了整个组合结构的操作。

总结

组合模式是一种结构型设计模式,它允许客户端以统一的方式处理单个对象以及对象组合。组合模式将对象组织成树状结构,使得客户端无需关心单个对象或组合对象的具体类型,而是可以使用相同的方式进行操作。通过组合模式,可以将多个对象组合成更大的、更复杂的对象,使得代码结构更加灵活和可扩展。其缺点是增加了代码的复杂性。组合模式在实现树形结构和复杂对象的场景中非常有用。


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

相关文章:

  • vue 获取摄像头拍照,并旋转、裁剪生成新的图片
  • 服务器被挂马怎么办?——解决服务器被挂马的方法和步骤
  • 基于 PyTorch 从零手搓一个GPT Transformer 对话大模型
  • 华为云前台展示公网访问需要购买EIP,EIP流量走向
  • Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
  • 大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载
  • 2023五一数学建模B题完整思路
  • 深入探究C++中的仿函数和迭代器——提升你的STL技能
  • SDKJ_JD 服务器部署
  • 解决Windows下QtCreator编译代码时错误:cc1plus.exe: out of memory allocating 65536 bytes
  • MCAL知识点(二十四):WDG MCAL驱动配置详解
  • 《统计学习方法》——EM算法及其推广(上)
  • 第四十二章 管理镜像 - 监控镜像
  • (八)Geoprocessing地理处理框架——基本介绍
  • GPT-4 API 接入之旅
  • react native ios 添加启动页 xcode14 react-native-splash-screen
  • 【机器学习】HOG+SVM实现行人检测
  • leetcode-024-两两交换链表中的节点
  • 【Java笔试强训 1】
  • 使用BP神经网络和Elman Net预测航班价格(Matlab代码实现)
  • 薪资17K是一个怎样的水平?来看看98年测试工程师的面试全过程…
  • 利用层级式一致性加强进行半监督病理图像分割
  • windows安装flutter
  • 【JavaEE进阶】——第四节.Spring更简单的实现Bean对象的存取(利用注解储存和注入Bean对象)
  • Spring Cloud Kubernetes使用全解(一)—官方原版
  • 【Java笔试强训 12】