组合模式

组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,
它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,
使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。

组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点,树形结构图如下。



组合模式是一种用于表示部分-整体层次结构的设计模式,使得客户端对单个对象和复合对象的使用具有一致性。换句话说,组合模式允许你将对象组合成树形结构,并且能像单个对象一样使用它们。

举个例子,假设我们要创建一个文件系统的模型。我们可以有文件夹(包含其他文件或文件夹)和文件。文件夹可以包含文件和其他文件夹,形成一个树形结构。我们希望能够统一处理文件和文件夹,比如打印它们的名字。

下面是使用C#实现组合模式的例子:

using System;  
using System.Collections.Generic;  
  
namespace CompositePatternExample  
{  
    // 组件接口  
    public interface IComponent  
    {  
        void PrintName();  
    }  
  
    // 叶节点,实现组件接口  
    public class File : IComponent  
    {  
        public string Name { get; set; }  
  
        public File(string name)  
        {  
            Name = name;  
        }  
  
        public void PrintName()  
        {  
            Console.WriteLine($"File: {Name}");  
        }  
    }  
  
    // 复合组件,包含子组件集合  
    public class Folder : IComponent  
    {  
        public string Name { get; set; }  
        public List<IComponent> Children { get; set; }  
  
        public Folder(string name)  
        {  
            Name = name;  
            Children = new List<IComponent>();  
        }  
  
        public void Add(IComponent component)  
        {  
            Children.Add(component);  
        }  
  
        public void PrintName()  
        {  
            Console.WriteLine($"Folder: {Name}");  
            foreach (var child in Children)  
            {  
                child.PrintName(); // 递归调用子组件的PrintName方法  
            }  
        }  
    }  
}

使用示例:

class Program  
{  
    static void Main(string[] args)  
    {  
        // 创建文件夹和文件对象  
        Folder rootFolder = new Folder("Root");  
        Folder subFolder1 = new Folder("SubFolder1");  
        Folder subFolder2 = new Folder("SubFolder2");  
        File file1 = new File("File1");  
        File file2 = new File("File2");  
        File file3 = new File("File3");  
  
        // 将文件和文件夹添加到树形结构中  
        rootFolder.Add(subFolder1);  
        rootFolder.Add(subFolder2);  
        subFolder1.Add(file1);  
        subFolder1.Add(file2);  
        subFolder2.Add(file3);  
  
        // 打印文件和文件夹的名字(递归)  
        rootFolder.PrintName(); // 输出: Folder: Root, Folder: SubFolder1, File: File1, File: File2, Folder: SubFolder2, File: File3  
    }  
}

输出结果如下:

Folder: Root  
Folder: SubFolder1  
File: File1  
File: File2  
Folder: SubFolder2  
File: File3

这个输出结果表示了文件夹和文件的树形结构,并按照层次打印了它们的名字。首先打印根文件夹 "Root",然后打印其子文件夹 "SubFolder1" 和 "SubFolder2"。接着,打印 "SubFolder1" 中的文件 "File1" 和 "File2",最后打印 "SubFolder2" 中的文件 "File3"。



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2023-11-30 16:38:40 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864