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 类中的操作和行为局部化。
Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】的更多相关文章
- 设计模式08: Composite 组合模式(结构型模式)
Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface I ...
- Composite组合模式(结构型模式)
1.概述 在面向对象系统中,经常会遇到一些具有"容器性质"的对象,它们自己在充当容器的同时,也充当其他对象的容器. 2.案例 需要构建一个容器系统,需要满足以下几点要求: (1). ...
- Composite 组合模式
简介 <大话设计模式>一书中组合模式的定义为:将对象组合成[树]形结构以表示[部分-整体]的层次结构,组合模式使得用户对[单个对象]和对[组合对象]的使用具有一致性. ...
- 十一、Composite 组合模式
原理: 代码清单 Entity public abstract class Entry { public abstract String getName(); public abstract int ...
- Composite 组合模式 树 递归 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 一天一个设计模式——Composite组合模式
一.模式说明 能够使容器与内容物具有一致性,创造出递归结构的模式就是Composite组合模式. 举个例子:计算机中的文件系统中有文件和文件夹的概念,我们知道,文件夹可以包含文件,也可以包含子文件夹, ...
- C++设计模式-Composite组合模式
Composite组合模式作用:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. UML图如下: 在Component中声明所有用来 ...
- C#设计模式之八桥接模式(Bridge)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的.因为桥在我们现实 ...
- C#设计模式之十三代理模式(Proxy)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字 ...
- C#设计模式之十一外观模式(Facade)【结构型】
一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...
随机推荐
- 记一次 .NET 某企业采购平台 崩溃分析
一:背景 1. 讲故事 前段时间有个朋友找到我,说他们的程序有偶发崩溃的情况,让我帮忙看下怎么回事,针对这种 crash 的程序,用 AEDebug 的方式抓取一个便知,有了 dump 之后接下来就可 ...
- .Net微服务实战
前言 第一篇.Net微服务实战是2020年开始的,整个系列拥有文章共11篇,抛开代码计算共有7W多字,每一篇都是我花了不少精力与心思进行打磨. 后续该系列有新增的文章会在此目录同步更新,也是主要方便自 ...
- Seal AppManager v0.2 发布:进一步简化应用部署体验
经过近3个月的研发,Seal AppManager v0.2 已正式发布. Seal AppManager 是一款基于平台工程理念的应用统一部署管理平台,于今年4月首次推出.在上一版本中,我们已经释出 ...
- 【HTML】Echart图表
layui-echarts 简介 基于layui 实现的 echart 图表 Echart 官网 示例 Echart示例 下载Echart Echart下载 我们选择最下面的在线定制 我这里就按照它默 ...
- 帮老娘导入SF信息
转自自己的QQ空间 2023/1/3 老娘公司要统计Excel 简单说就是把顺丰上面寄的85个快递填到表里去 再把没有寄的从那两张表加起来130多个人里面揪出来单独填表 有些企业的Excel就是个灾难 ...
- Spring Boot Starter 剖析与实践
引言 对于 Java 开发人员来说,Spring 框架几乎是必不可少的.它是一个广泛用于开发企业应用程序的开源轻量级框架.近几年,Spring Boot 在传统 Spring 框架的基础上应运而生,不 ...
- 解读 --- Span<T>
引言 Span<T> 是C# 中的一种结构体,它是一种内存安全的类型,可以用来表示连续的内存区域.Span<T> 可以被用于访问和操作数组.堆上分配的内存和栈上分配的内存.使用 ...
- nflsoj 选数1 2 3
5711 取数-1 状态表示:1维 集合:前 \(i\) 个数里面所有的选法和 属性:所有的选法和的最大值 状态计算:选或不选 选:\(f(i-1)+a_i\) 不选:\(f(i-1)\) #incl ...
- CAJViewer卡的解决办法
在做毕业设计时,使用了CAJViewer7.2版本的阅读器,使用起来非常卡,翻页总是不流畅,体验感极差. 最后实在受不了了,去百度了一下,在贴吧中看到了疑似解决方案,尝试了一下,真的不卡了.所以特此写 ...
- [HDCTF2019]Maze 反汇编-花指令处理
这是一道迷宫花指令加upx脱壳处理的题 先介绍花指令 一. 概述 花指令是对抗反汇编的有效手段之一,正常代码添加了花指令之后,可以破坏静态反汇编的过程,使反汇编的结果出现错误.错误的反汇编结果会造成破 ...