c# 组合模式


在C#中,组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式让客户端代码可以一致地处理单个对象和对象的组合。

以下是一个简单的C#实现组合模式的例子,包括组件接口(Component)、叶子节点(Leaf)和组合节点(Composite):


using System;
using System.Collections.Generic;

// 组件接口
public abstract class Component
{
    public string Name { get; set; }

    // 声明一个方法,供叶子对象和组合对象调用,以实现透明操作
    public abstract void Operation();

    // 添加子组件的方法(可选,取决于具体需求)
    // 这里为了简单起见,我们不在接口中声明,而是在Composite类中实现
}

// 叶子节点
public class Leaf : Component
{
    public Leaf(string name)
    {
        this.Name = name;
    }

    public override void Operation()
    {
        Console.WriteLine($"Leaf: {Name}");
    }
}

// 组合节点
public class Composite : Component
{
    private List<Component> _children = new List<Component>();

    public Composite(string name)
    {
        this.Name = name;
    }

    // 添加子组件
    public void Add(Component component)
    {
        _children.Add(component);
    }

    // 移除子组件(可选)
    // public void Remove(Component component) { ... }

    // 重写Operation方法,遍历并调用所有子组件的Operation方法
    public override void Operation()
    {
        Console.WriteLine($"Composite: {Name}");
        foreach (var child in _children)
        {
            child.Operation();
        }
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        // 创建组合对象
        Composite root = new Composite("root");

        // 创建叶子节点并添加到组合对象
        root.Add(new Leaf("Leaf A"));
        root.Add(new Leaf("Leaf B"));

        // 创建另一个组合对象,并添加更多组件
        Composite branch1 = new Composite("Branch 1");
        branch1.Add(new Leaf("Leaf X"));
        branch1.Add(new Leaf("Leaf Y"));

        // 将组合对象作为子节点添加到根组合对象
        root.Add(branch1);

        // 执行操作
        root.Operation();
    }
}

在这个例子中,`Component` 是一个抽象类,它定义了一个公共的接口,用于访问和管理组件的子对象。`Leaf` 类表示叶子节点,它没有子节点。`Composite` 类表示容器节点,它可以包含其他 `Component` 对象(无论是叶子节点还是其他组合节点)。`Operation` 方法在 `Leaf` 和 `Composite` 类中被重写,以在客户端代码中提供一致的操作接口。

这个模式的关键是允许客户端代码使用统一的接口来对待单个对象和对象的组合。