CompositePattern-组合模式

发布时间 2023-08-18 15:12:14作者: ZHIZRL

在C#中,组合模式(Composite Pattern)是一种结构型设计模式,它允许您将对象组合成树状的结构,以表示部分-整体的层次关系,使得客户端可以以一致的方式处理单个对象和对象组合。

在组合模式中,有以下几个角色:

Component(组件):是组合中所有对象的通用接口,可以是抽象类或接口。它声明了一些操作的方法,例如添加、删除和获取子组件。

Leaf(叶子节点):表示组合中的叶子对象,没有子节点。它实现了Component接口的方法。

Composite(组合节点):表示具有子节点的复合对象,在组合中可以包含其他叶子节点或者复合节点。它实现了Component接口的方法,并包含一个子组件列表。

namespace CompositePattern_组合模式
{
    internal class Program
    {
        // Component
        public abstract class FileSystemComponent
        {
            protected string name;

            public FileSystemComponent(string name)
            {
                this.name = name;
            }
            public abstract void Add(FileSystemComponent component);
            public abstract void Remove(FileSystemComponent component);
            public abstract void Display(int depth);
        }
        // Leaf
        public class File : FileSystemComponent
        {
            public File(string name) : base(name)
            {

            }
            public override void Add(FileSystemComponent component) { }
            public override void Remove(FileSystemComponent component) { }
            public override void Display(int depth)
            {
                Console.WriteLine(new string('-', depth) + name);
            }
        }
        // Composite
        public class Directory : FileSystemComponent
        {
            private List<FileSystemComponent> components = new List<FileSystemComponent>();

            public Directory(string name) : base(name) { }
            public override void Add(FileSystemComponent component)
            {
                components.Add(component);
            }
            public override void Remove(FileSystemComponent component)
            {
                components.Remove(component);
            }
            public override void Display(int depth)
            {
                Console.WriteLine(new string('-', depth) + name);

                foreach (var component in components)
                {
                    component.Display(depth + 2);
                }
            }
        }
        static void Main(string[] args)
        {
            // 创建文件和目录
            FileSystemComponent file1 = new File("file1.txt");
            FileSystemComponent file2 = new File("file2.txt");
            FileSystemComponent file3 = new File("file3.txt");

            Directory dir1 = new Directory("dir1");
            Directory dir2 = new Directory("dir2");
            Directory dir3 = new Directory("dir3");

            // 构建文件系统的层次结构
            dir1.Add(file1);
            dir2.Add(file2);
            dir3.Add(file3);

            dir1.Add(dir2);
            dir1.Add(dir3);

            // 显示文件系统
            dir1.Display(0);
            Console.Read();
            //输出结果
            //dir1
            //--file1.txt
            //--dir2
            //----file2.txt
            //--dir3
            //----file3.txt
        }
    }
}

在上述示例中,使用组合模式创建了一个文件系统的层次结构。FileSystemComponent作为抽象的组件,File作为叶子节点,Directory作为复合节点,并实现了相应的操作方法。客户端可以以一致的方式处理文件和目录对象,并按层次结构显示文件系统。

组合模式在需要表示部分-整体的层次关系时非常有用,它提供了一致性的接口和简化客户端的代码。它还支持递归组合,使得可以灵活地处理复杂的层次结构。