C#编程模式之组合模式(Composite)

ops/2025/1/16 0:03:55/

        创作背景:各位朋友,我们继续C#编程模式的探讨,这次探讨的模式是组合模式。它和桥接模式一样,是一种结构型设计模式,允许使用者将对象组合成树形结构来展示其“部分和整体”的层次结构。要求同样比较严格,用户对单个对象和组合对象的使用需具有一致性。

        组合模式我的理解就像是俄罗斯套娃,大圈套小圈😃😃。上代码!!!

        1、Component管理类,也可以当作节点使用。

    /// <summary>/// 抽象一个类,管理Component的子部件/// </summary>public abstract class Component{protected string name;public Component(string name) { this.name = name; }/// <summary>/// 增加节点/// </summary>/// <param name="component"></param>public abstract void Add(Component component);/// <summary>/// 移除节点/// </summary>/// <param name="component"></param>public abstract void Remove(Component component);/// <summary>/// 显示结构/// </summary>public abstract string Display(int level);}

        2、Leaf末端节点类。

    /// <summary>/// 叶子节点(无增加节点和删除节点功能)/// </summary>public class Leaf : Component{/// <summary>/// 构造函数/// </summary>/// <param name="name"></param>public Leaf(string name) : base(name) { }public override void Add(Component component) { }public override void Remove(Component component) { }/// <summary>/// 显示层级/// </summary>/// <param name="level"></param>public override string Display(int level){string strResult = string.Empty;strResult = (new string('-', level) + name);return strResult;}}

        3、Composite组合类。

    /// <summary>/// 定义有枝节点的行为,用来存储部件,实现在Component接口中对子部件有关的操作/// </summary>public class Composite : Component{/// <summary>/// 构造函数/// </summary>/// <param name="name"></param>public Composite(string name) : base(name) { }/// <summary>/// 一个子对象集合,用来存储其下属的枝节点和叶节点/// </summary>private List<Component> children = new List<Component>();/// <summary>/// 增加子节点/// </summary>/// <param name="component"></param>public override void Add(Component component){children.Add(component);}/// <summary>/// 移除子节点/// </summary>/// <param name="component"></param>public override void Remove(Component component){children.Remove(component);}/// <summary>/// 遍历所有节点,显示层级结构/// </summary>/// <param name="level"></param>/// <returns></returns>public override string Display(int level){string strResult = string.Empty;strResult = (new string('-', level) + name);// 遍历其子节点并显示foreach (Component component in children){strResult += "\r\n" + component.Display(level + 2);}return strResult;}}

        4、客户端调用。

        /// <summary>/// 组合模式测试/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_comb_Click(object sender, EventArgs e){// 生成树根,并为其增加两个叶子节点Combination.Component root = new Composite("Root");root.Add(new Leaf("Leaf A in Root"));root.Add(new Leaf("Leaf B in Root"));// 为根增加两个枝节点Combination.Component branchX = new Composite("Branch X in Root");Combination.Component branchY = new Composite("Branch Y in Root");root.Add(branchX);root.Add(branchY);// 为BranchX增加页节点branchX.Add(new Leaf("Leaf A in Branch X"));// 为BranchX增加枝节点Combination.Component branchZ = new Composite("Branch Z in Branch X");branchX.Add(branchZ);// 为BranchY增加叶节点branchY.Add(new Leaf("Leaf in Branch Y"));// 为BranchZ增加叶节点branchZ.Add(new Leaf("Leaf in Branch Z"));// 显示树tbox_Comb.Text = root.Display(1);}

        5、程序运行截图。

        以上就是小编对组合模式的浅浅的理解,希望对各位有所帮助。 


http://www.ppmy.cn/ops/25591.html

相关文章

Docker镜像的创建 和 Dockerfile

一. Docker 镜像的创建 创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于 Dockerfile 创建。 1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web3 centos:7 /bin/bash …

Tomcat基本使用与控制台乱码解决方式

目录 Tomcat简单介绍 Tomcat基本使用 Tomcat控制台乱码解决方式 Tomcat简单介绍 tomcat是apache开源绿色版本的服务器。 Tomcat基本使用 安装&#xff1a;下载zip包解压即可。 卸载&#xff1a;删除解压的tomcat文件夹即可。 启动&#xff1a;双击bin/startup.bat 停止…

机器学习理论基础—集成学习(1)

机器学习理论基础—集成学习 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也称为多分类系统等。 分类&#xff1a; 根据集成学习中的个体学习器的不同可以分为同质集成&#xff08;集成的学习器相同例如全部是决策树&#xff09;&#xff0c…

meshio解析vtu(非结构化网格)文件

meshio 是一个用于读取和写入网格和数据文件的Python库&#xff0c;如VTK文件。要使用meshio来解析VTU文件&#xff0c;你需要首先安装meshio库。 安装meshio的命令如下&#xff1a; pip install meshio以下是使用meshio解析VTU文件的示例代码&#xff1a; import meshio# 读…

Qt窗口全屏显示方法

要在Qt中设置窗口全屏显示&#xff0c;可以采取以下方法&#xff1a; 使用showFullScreen()方法&#xff1a; 对于QWidget对象&#xff0c;可以直接调用showFullScreen()方法来实现全屏显示。 QWidget w; w.showFullScreen();使用setWindowState()方法&#xff1a; 可以通过…

SpringWebFlux RequestBody多出双引号问题——ProxyPin抓包揪出真凶

缘起 公司有个服务做埋点收集的&#xff0c;可以参考我之前的文章埋点日志最终解决方案&#xff0c;今天突然发现有些数据日志可以输出&#xff0c;但是没法入库。 多出的双引号 查看Flink日志发现了JSON解析失败&#xff0c;Flink是从Kafka拿数据&#xff0c;Kafka本身不处…

场景文本检测识别学习 day06(Vi-Transformer论文精读)

Vi-Transformer论文精读 在NLP领域&#xff0c;基于注意力的Transformer模型使用的非常广泛&#xff0c;但是在计算机视觉领域&#xff0c;注意力更多是和CNN一起使用&#xff0c;或者是单纯将CNN的卷积替换成注意力&#xff0c;但是整体的CNN 架构没有发生改变VIT说明&#x…

Qt相关开源项目总结

Qt官方github&#xff1a; https://github.com/orgs/qt/repositories 参考 https://blog.csdn.net/pzs0221/article/details/131337353