首页 > 其他分享 >重温设计模式 --- 组合模式

重温设计模式 --- 组合模式

时间:2023-07-11 14:11:22浏览次数:27  
标签:leaf name 组合 重温 Component public --- 设计模式 节点

引言

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,因为它们都具有相同的接口。

组合模式由三个要素组成:

  1. 抽象组件(Component):它定义了叶子节点和组合节点的公共接口,可以为叶子节点和组合节点提供默认实现。

  2. 叶子组件(Leaf):它表示组合的叶子节点,没有子节点。

  3. 组合组件(Composite):它表示组合的内部节点,可以包含叶子节点或其他组合节点。

抽象组件

// 抽象组件类
abstract class Component
{
    protected string name;

    public Component(string name)
    {
        this.name = name;
    }

    public abstract void Add(Component c);
    
    public abstract void Remove(Component c);
    
    public abstract void Display(int depth);
}

叶子组件

// 叶子节点类
class Leaf : Component
{
    public Leaf(string name) : base(name)
    {
    }

    public override void Add(Component c)
    {
        Console.WriteLine("Cannot add to a leaf");
    }

    public override void Remove(Component c)
    {
        Console.WriteLine("Cannot remove from a leaf");
    }

    public override void Display(int depth)
    {
        Console.WriteLine(new String('-', depth) + name);
    }
}

组合组件

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

    public Composite(string name) : base(name)
    {
    }

    public override void Add(Component c)
    {
        children.Add(c);
    }

    public override void Remove(Component c)
    {
        children.Remove(c);
    }

    public override void Display(int depth)
    {
        Console.WriteLine(new String('-', depth) + name);

        foreach (Component component in children)
        {
            component.Display(depth + 1);
        }
    }
}

在上面的示例中,Component是抽象组件类,包含了组合模式中共有的方法。Leaf是叶子节点类,表示树状结构中的叶子节点,而Composite是组合节点类,表示树状结构中的组合节点。

可以这样调用:

Composite root = new Composite("root");

root.Add(new Leaf("leaf A"));

root.Add(new Leaf("leaf B"));

Composite composite = new Composite("composite X");

composite.Add(new Leaf("leaf XA"));

composite.Add(new Leaf("leaf XB"));

root.Add(composite);

root.Add(new Leaf("leaf C"));

root.Display(0);

客户端代码创建了一个根节点root,并向它添加了三个子节点:两个叶子节点和一个组合节点composite。组合节点composite又包含了两个叶子节点。最后,客户端代码调用根节点的Display方法,打印出整个树状结构。

输出结果如下:

root
-leaf A
-leaf B
-composite X
--leaf XA
--leaf XB
-leaf C

总结

组合模式的关键是定义了一个抽象组件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象组件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。同时容器对象与抽象组件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构。

标签:leaf,name,组合,重温,Component,public,---,设计模式,节点
From: https://www.cnblogs.com/pandefu/p/17536301.html

相关文章

  • VUE基础01-响应式
    SFC(Single-FileComponent,缩写为SFC)SFC是一种可复用的代码组织形式,它将从属于同一个组件的HTML、CSS和JavaScript封装在使用.vue后缀的文件中。响应式reactive()reactive()只适用于对象(包括数组和内置类型,如Map和Set)。import{reactive}from'vue'const......
  • go语言-不同类型转换为JSON格式数据
    1.将结构体转换为JSON:packagemainimport( "encoding/json" "fmt")typePersonstruct{ Namestring Ageint Emailstring}funcmain(){ person:=Person{Name:"Alice",Age:25,Email:"[email protected]"} ......
  • 【雕爷学编程】Arduino动手做(158)---VL53L0X激光测距模块3
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • DPI-1047Python的exe无法执行问题
    一、序打包运行的exe在其他设备上出现DPI-1047:Cannotlocatea64-bitOracleClientlibrary:Thespecifiedmodulecouldnotbefound.二、解决方法1、安装OracleInstantClient2、配置系统环境Path中添加解压路径如(C:\Users\Administrator\Desktop\instantclient......
  • Golang学习笔记-判断
    判断有两种:if和switchif判断if用于条件判断,它会按照顺序一次执行,当if条件及elseif条件都不成立,则会执行else部分的逻辑语法if条件判断{...}elseif条件判断{...}else{...}栗子varmoneyint=18ifmoney>0&&money<=1000{fmt.Pri......
  • imessages群发,苹果imessages短信,苹果imessages推信,完美实现 - 电脑升级版
    一、PC电脑版苹果系统(MacOS)上实现imessages群发总结为以下几种方式:/*MacOS苹果系统,正常情况下,只能安装到苹果公司自己出品的Mac电脑,俗称白苹果,不能安装到各种组装机或者其他品牌的品牌机上,黑苹果的的原理,就是通过一些“破解补丁”工具欺骗macOS系统,让苹果系统认为你的电......
  • 25-IP核简介
    1.IPIP(IntellectualProperty)即知识产权,在半导体产业中讲IP核定义为用于“ASIC或FPGA中的预先设计好的电路功能模块”。简言之,这里的IP即电路功能模块。在数字电路中,将常用的且比较复杂的功能模块设计成参数可修改的模块(FIFO、RAM、SDRAMC),可以让其他用户可以直接调用这些模块,......
  • 【雕爷学编程】Arduino动手做(158)---VL53L0X激光测距模块2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • TP-LINK面试真题和答案,您能做对几道?
    话说TP-LINK联洲的秋招提前批已经开启很久了,6月份就已经开启了,并且最近已经有人陆陆续续拿到口头Offer了,所以今天就来给大家介绍一下TP-LINK的面试流程和真题及答案解析。秋招提前批投递地址官网投递地址:https://hr.tp-link.com.cn/jobListTP-LINK面试流程TP-LINK整......
  • 网站木马文件查找之-列出2023年网站根目录下以及子目录所有php文件
    本代码适合查找网站挂马(木马)文件使用<?phpfunctionlistPhpFiles($directory){$fileList=[];$iterator=newRecursiveIteratorIterator(newRecursiveDirectoryIterator($directory));foreach($iteratoras$file){if($file->isFile()&&$......