首页 > 编程语言 >Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】

Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】

时间:2023-12-27 20:26:24浏览次数:37  
标签:组合 示例 Composite Component public 对象 设计模式 节点

Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】

 

阅读目录


回到顶部

〇、简介

1、什么是组合设计模式?

一句话解释:

  针对树形结构的任意节点,都实现了同一接口,他们具有相同的操作,可以通过某一操作来遍历全部节点。

组合模式通过使用树形结构来组合对象,用来表示部分以及整体层次。组合模式属于结构型模式,多用于递归。

官方意图描述:将对象组合成树形结构,以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合的使用具有一致性。

一个比喻:(学校里年级、班级架构)

  无论是年级主任,还是各班主任或任课老师,以及每个班级的学生,都属于学校中的一员,但是他们又属于分级管理,比如班主任管理一个班级。

2、优缺点和适用场景

优点:

  • 高层模块调用简单。组合模式通过提供统一的接口来隐藏对象的层次结构,使高层模块只需要关心对象的行为,而不需要关心对象的结构。这样可以使高层模块的代码更加简洁和易于理解。
  • 节点自由,不需要关心对象层次。组合模式通过使用树形结构来组合对象,可以动态地增加或删除对象,而不需要修改高层模块的代码。这样可以使系统更加灵活和可扩展。
  • 简化了客户端代码,因为不论对象多么复杂客户端都是以同一套接口操作。

缺点:

  • 叶子节点(Leaf)会继承得到一些它所不需要(管理子类操作的方法)的方法,这与设计模式接口隔离原则相违背。组合模式中的叶子节点(Leaf)也需要实现 Component 接口,而这个接口中可能包含了一些它所不需要的方法。这会使得叶子节点的代码变得冗余和复杂,不符合接口隔离原则。
  • 组合类的引用开销可能会较大。组合模式中的组合类需要包含一个 Component 数组,这个数组的大小是固定的,如果组合类的实例需要包含大量的组件对象,那么组合类的引用开销可能会较大。
  • 如果需要确定某个组件是特殊组织,然后针对它做特殊的操作,就需要在运行时判断。

适用场景:

  • 希望客户端可以忽略组合对象与单个对象的差异时。组合模式通过提供统一的接口来隐藏对象的层次结构,使客户端可以忽略组合对象与单个对象的差异。
  • 对象层次具备整体和部分,呈树形结构。组合模式通过使用树形结构来组合对象,可以用来表示对象层次具备整体和部分,呈树形结构的情况。例如:树形菜单,文件、文件夹的管理。
回到顶部

一、简单的代码示例

下边是一个简单的示例,模拟树形结构,包含多层次:

  class Program
  {
  static void Main(string[] args)
  {
  Composite root = new Composite("根节点");
  Composite composite1 = new Composite("--组合节点1");
  Composite composite2 = new Composite("--组合节点2");
  Leaf leaf1 = new Leaf("----叶子节点1");
  Leaf leaf2 = new Leaf("----叶子节点2");
  composite1.Add(leaf1);
  composite1.Add(leaf2);
  composite2.Add(leaf1);
  root.Add(composite1);
  root.Add(composite2);
  root.Operation();
  }
  }
  // 抽象组件
  public abstract class Component
  {
  public string Name { get; set; }
  public Component(string name)
  {
  Name = name;
  }
  public virtual void Operation()
  {
  Console.WriteLine("执行操作");
  }
  }
  // 叶子组件
  public class Leaf : Component
  {
  public Leaf(string name) : base(name) { }
  public override void Operation()
  {
  Console.WriteLine($"{Name} 是叶子节点,不包含子节点");
  }
  }
  // 容器组件
  public class Composite : Component
  {
  private List<Component> _children = new List<Component>();
  public Composite(string name) : base(name) { }
  public void Add(Component component)
  {
  _children.Add(component);
  }
  public void Remove(Component component)
  {
  _children.Remove(component);
  }
  public override void Operation()
  {
  Console.WriteLine($"{Name} 是容器节点,包含子节点");
  foreach (var child in _children)
  {
  child.Operation();
  }
  }
  }

回到顶部

二、根据示例代码看结构

Component:为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的缺省行为。它可为一个接口,用于访问和管理 Component 的子组件。另外,可在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。

Leaf:在组合中表示叶节点对象,叶结点没有子节点。另外,也可以定义图元对象的行为。(图元对象是计算机图形学中的一个概念,是指由点、线、面等基本几何元素组成的三维模型的基本单元。图元对象通常用于描述三维模型的几何形状和空间位置等信息。)

Composite:定义有子部件的那些部件的行为,可通过 Components 存储子部件,以及在 Component 接口中实现与子部件有关的操作。

Client:通过 Component 接口操纵组合部件的对象。

回到顶部

三、相关模式

通常,部件-父部件连接用于 Chain of Responsibility 责任链模式。

Decorator 装饰模式经常和 Composite 模式一起使用。当装饰和组合一起使用时,它们通常由一个公共的父类。因此装饰必须具有 Add、Remove 和 GetChild 操作的 Component 接口。

Flyweight 享元模式允许共享组件,但不能引用其父部件。

Itertor 迭代器模式可用于遍历 Composite。

Visitor 访问者模式将本来应该分布在 Composite 和 Leaf 类中的操作和行为局部化。

本文来自博客园,作者:橙子家,微信号:zfy1070491745,有任何疑问欢迎沟通,一起成长! 您的支持,博主的动力!

标签:组合,示例,Composite,Component,public,对象,设计模式,节点
From: https://www.cnblogs.com/sexintercourse/p/17931344.html

相关文章

  • Facade 外观模式简介与 C# 示例【结构型5】【设计模式来了_10】
    Facade外观模式简介与C#示例【结构型5】【设计模式来了_10】 阅读目录〇、简介1、什么是外观模式?2、外观模式的优缺点和适用场景一、外观模式的代码实现二、结构三、相关模式回到顶部〇、简介1、什么是外观模式?一句话解释:  将一系列需要一起进行的......
  • Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】
    Builder生成器模式简介与C#示例【创建型2】【设计模式来了_2】 阅读目录〇、简介1、什么是生成器模式?2、优缺点和使用场景一、简单的示例代码二、生成器模式结构三、在.Net框架中的实际应用四、相关模式回到顶部〇、简介1、什么是生成器模式?一句话......
  • Decorator 装饰者模式简介与 C# 示例【结构型4】【设计模式来了_9】
    Decorator装饰者模式简介与C#示例【结构型4】【设计模式来了_9】 阅读目录〇、简介1、什么是装饰者模式2、优缺点和适用场景一、通过示例代码简单实现二、装饰者模式的结构三、相关模式回到顶部〇、简介1、什么是装饰者模式一句话解释:  通过继承统......
  • openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作
    openGauss学习笔记-175openGauss数据库运维-备份与恢复-导入数据-管理并发写入操作示例本章节以表test为例,分别介绍相同表的INSERT和DELETE并发,相同表的并发INSERT,相同表的并发UPDATE,以及数据导入和查询的并发的执行详情。CREATETABLEtest(idint,namechar(50),addressva......
  • Java 工厂方法设计模式
    需求:Pizza有以下几个方法prepare()准备食材bake()烘焙cut()切割box()装盒现在有2种披萨且和2地区有关,成都地区第一种是CDApplePizza,第二种是CDCheesePizza。北京地区的BJApplePizza和BJApplePizza。PizzaStore有点单系统Order(city,pizzaType)根据pizzatype去制作对......
  • flutter常用的设计模式
    单例模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。工厂模式(FactoryPattern):定义一个创建对象的接口,但让子类决定具体实例化哪个类;常用于创建组件、复杂对象等场景。抽象工厂模式(AbstractFactoryPattern):提供一个创建一系列相关或相互依赖对象的接口,而......
  • JAVA 设计模式(一) - 单例模式
    JAVA设计模式(一)-单例模式本篇文章主要讲下android创建型设计模式中的单例模式.单例模式保证一个类只有一个实例,并提供一个访问该实例的全局节点.它的实现有多种实现方式:1:饿汉式饿汉式:类加载时就创建实例.不支持延迟加载实例publicclassSingleton{priva......
  • JAVA设计模式(三)-原型
    JAVA设计模式(三)-原型本篇文章主要讲下java创建型设计模式中的原型模式.何谓原型模式:简单来说就是将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。使用原型模式,就可以简化实例化的过程,不必依赖于构造函数或者new关键字.由于java提供了clone方法......
  • JAVA设计模式(二)-简单工厂
    JAVA设计模式(二)-简单工厂本篇文章主要讲下java创建型设计模式中的简单工厂模式.简单工厂模式又叫静态工厂方法模式(StaticFactoryMethodPattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。1:定义接口publicinterfacePeople{v......
  • JWT 简介与 C# 示例
    〇、什么是JWT?JWT,即JSONWebToken,是一种基于JSON的开放标准(RFC7519),主要用于在网络应用环境间安全地传递声明。这种声明被进行了数字签名,可以验证和信任,因此,它适用于各种需要信息安全性和无状态的应用。在具体加密过程中,客户端会使用RSA算法生成JWT串,这里用到了私钥“......