C#设计模式09——组合模式的写法

这篇具有很好参考价值的文章主要介绍了C#设计模式09——组合模式的写法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 什么是C#组合模式?

组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示“整体/部分”层次结构。使用此模式,客户端可以按相同的方式处理单个对象和对象集合,而不必关注它们是单个对象还是组合对象。组合对象本身也可以作为容器,包含其他组合对象,形成更复杂的树形结构。

在C#中,组合模式是一种递归嵌套的设计模式,通常需要使用抽象类或接口表示“整体”和“部分”之间的关系,并将部件对象存储在它们的容器中。通过通过将容器中的部件继续使用相同的方式处理,客户端代码可以逐级访问嵌套对象,而不必知道每个对象的具体类型或是否是叶子节点。

2. 为什么要使用C#组合模式?

组合模式可以方便地处理层次结构,例如组织机构、文件系统或UI控件。使用该模式,可以将树形数据结构的遍历变得简单且具有一致性,而无论遍历哪个节点,只需按照相同的方式进行。

使用组合模式还可以使代码更加灵活。由于容器和叶子节点可以互换使用,可以轻松地添加新的叶子节点和容器对象,而不会影响其它部分代码的实现。

3. 组合模式的主要角色有哪些?

C#组合模式通常涉及四个主要角色:

- 抽象组件(Component): 定义组合关系的抽象类或接口,为容器和叶子节点共享的操作提供通用的实现。
- 叶子节点(Leaf): 组合树结构中的最底层元素,它们没有子节点,具有特定的行为。
- 容器(Composite): 包含一组子节点并维护它们之间的组合结构。容器可以包含其他容器和叶子节点,统一对子节点操作。
- 客户端(Client): 使用组合结构的代码,通常通过容器操作组合节点,而不必关注如何管理节点之间的组合关系,将复杂度降到最低。

4. 组合模式如何实现?

组合模式的一个常见实现方案是将组件抽象成接口或抽象类。这个抽象类包含容器和叶子节点的通用行为和属性,并定义了添加、删除和获取子节点的方法。容器实现这个抽象类,并维护它们的子节点,而叶子节点扩展它们自己的逻辑。

通常情况下,容器会将它自己的操作通过递归调用委托给子节点,从而在深层次的嵌套结构中完成某个指定操作。客户端代码使用这个抽象接口或类,而不是具体的实现对象,实现了透明的管理树形结构元素。

5. 组合模式有哪些优缺点?

优点:

- 可以方便地处理树状结构,具有一致性和可维护性。
- 组合对象可以递归嵌套,允许动态的添加和删除节点和树形结构。
- 通过共享相同接口或抽象类,客户端代码可以无缝切换一个元素与多个元素之间的关系,从而简化代码逻辑。
- 允许在叶子和组合对象中分别添加新的行为和操作,而不会影响其它部分的代码。

缺点:

- 可能难以限制容器中的元素类型,会产生一定的安全隐患。
- 由于递归嵌套,可能对内存和性能有一定的影响。
- 当组合对象拥有大量子节点时,可能会对代码可读性和理解性造成一定的困难。

 

以下是一个使用C#组合模式的示例代码:

//抽象组件
public abstract class Component
{
    protected string Name;
    public Component(string name)
    {
        Name = name;
    }
    public abstract void Add(Component c);
    public abstract void Remove(Component c);
    public abstract void Display(int depth);
}

//叶子节点
public 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);
    }
}

//容器
public 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 + 2);
        }
    }
}

//客户端
class Client
{
    static void Main(string[] args)
    {
        Composite root = new Composite("root");
        root.Add(new Leaf("Leaf A"));
        root.Add(new Composite("Composite X"));
        Composite compositeY = new Composite("Composite Y");
        compositeY.Add(new Leaf("Leaf B"));
        compositeY.Add(new Leaf("Leaf C"));
        root.Add(compositeY);
        Leaf leafD = new Leaf("Leaf D");
        root.Add(leafD);
        root.Remove(leafD);
        root.Display(1);

        Console.ReadKey();
    }
}

在上述代码中,抽象组件是Component类,其中包含添加、删除和展示子节点等公共方法。叶子节点Leaf和容器Composite分别继承了Component,并实现了它们自己的逻辑。客户端使用抽象组件Component来透明地处理叶子节点和容器对象,并对它们进行操作。在Main方法中,创建了一个根容器对象,并添加了一些叶子节点和容器对象。输出结果是一个树形结构。

-root
--Leaf A
--Composite X
--Composite Y
---Leaf B
---Leaf C

其中,输出的内容是按照树形结构展示的,每行前面添加了一些连字符("-")来表示层次结构深度。可以看到,root节点包含了三个子节点,其中compositeY节点又包含了两个子节点。最后,“Leaf D”节点被移除了。文章来源地址https://www.toymoban.com/news/detail-437458.html

到了这里,关于C#设计模式09——组合模式的写法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 研磨设计模式day09原型模式

    目录 场景 代码实现 有何问题 解决方案 代码改造  模式讲解 原型与new 原型实例与克隆出来的实例 浅度克隆和深度克隆 原型模式的优缺点 思考 何时选用? 相关模式  场景 代码实现 定义订单接口  个人订单实现 企业订单实现 通用的订单处理 客户端使用 有何问题  简述:

    2024年02月11日
    浏览(34)
  • Java设计模式系列--观察者模式写法2:JDK

    原文网址:Java设计模式系列--观察者模式写法2:JDK_IT利刃出鞘的博客-CSDN博客 说明 本文用示例介绍观察者模式的一种写法:JDK。 JDK的观察者模式简介 在 Java 中,java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现这两个接口就可以编写观察者模式。 1. Ob

    2024年02月13日
    浏览(39)
  • 【2023-05-09】 设计模式(单例,工厂)

    单例模式 顾名思义,就是整个系统对外提供的实例有且只有一个 特点: ​ 1、单例类只有一个实例 ​ 2、必须是自己创建唯一实例 ​ 3、必须给所以对象提供这个实例 分类:一般分为饿汉式单例(直接实例化)和懒汉式单例(使用时才实例化) 饿汉式单例 懒汉式单例 同步

    2024年02月03日
    浏览(40)
  • 设计模式-组合模式

    组合模式可以使用一棵树来表示 组合模式使得用户可以使用一致的方法操作单个对象和组合对象 组合模式又叫部分整体模式,将对象组合成树形结构以表示“部分-整体”的层次结构,可以更好的实现管理操作,部分-整体对象的操作基本一样,但是应该还会有不一样的地方

    2024年02月10日
    浏览(51)
  • 设计模式--组合模式

    某日,小明公司最近接到一个办公管理系统的项目,并且在每个城市都有分部。这属于是很常见的OA系统,只要前期将需求分析完善好,中后期开发维护是不难的。 然而,总部公司使用后觉得很OK,想要其他城市的分公司也执行使用。但是现在的问题是,其他分公司的部门和

    2024年01月21日
    浏览(59)
  • 设计模式:组合模式

    组合模式是一种结构型设计模式,用于将对象组织成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,而不需要区分它们之间的差异。 在组合模式中,有两种主要类型的对象:叶节点和组合节点。叶节点表示树结构中的

    2024年02月07日
    浏览(60)
  • 设计模式——10. 组合模式

    组合模式是一种结构型设计模式,用于将对象组合成树状结构以表示“部分-整体”的层次结构。它允许客户端以一致的方式处理单个对象和组合对象(包含多个对象的容器),使得客户端无需关心它们之间的差异。 组合模式通常涉及两种主要角色: 叶子节点(Leaf):这是组

    2024年02月07日
    浏览(67)
  • 设计模式——组合模式08

    组合模式:把类似对象或方法组合成结构为树状的设计思路。 例如部门之间的关系。 设计模式,一定要敲代码理解 满足开闭原则。叶子结点与非叶子结点都继承或实现同一抽象,只是叶子功能权限少,而非叶子结点需要容器记录子节点。 代码下载

    2024年04月11日
    浏览(48)
  • 设计模式——组合模式

    组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。 组合模式将

    2024年02月11日
    浏览(70)
  • 设计模式浅析(十) ·设计模式之迭代器&组合模式

    日常叨逼叨 java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁 案例 有两家门店,门店A呢只提供早餐,门店B呢只提供午餐,有一天这两家店铺想要进行合并,一起做大做强,再创辉煌。 合并后呢,对于菜单的定制存在了一定的问题: 门店A的

    2024年04月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包