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”节点被移除了。
C#设计模式09——组合模式的写法的更多相关文章
- C#设计模式(10)——组合模式(Composite Pattern)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- c++设计模式15 --组合模式
今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- JavaScript设计模式之----组合模式
javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...
- C#设计模式(10)——组合模式(Composite Pattern)(转)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- C#设计模式:组合模式(Composite Pattern)
一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; ...
- [设计模式] 8 组合模式 Composite
DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...
- 【GOF23设计模式】组合模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_组合模式.树状结构.杀毒软件架构.JUnite底层架构.常见开发场景 package com.test.composite ...
- 设计模式:组合模式(Composite)
定 义:将对象组合树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象使用具有一致性. 结构图: Component类: abstract class Component ...
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
组合模式 组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 如果有一个 ...
随机推荐
- 浅谈SQL优化小技巧
回顾MySQL的执行过程,帮助介绍如何进行sql优化. (1)客户端发送一条查询语句到服务器: (2)服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据: (3)未命中缓存后,MySQL通过 ...
- [ABC265F] Manhattan Cafe
Problem Statement In an $N$-dimensional space, the Manhattan distance $d(x,y)$ between two points $x ...
- Java连接phoenix问题
这个错误的原因是找不到文件,所以要在本地配置一下hadoop的环境变量 下载 将其中hadoop 这个文件放在c盘windows下system32目录下就ok了
- Arrarylist集合的使用
前提:最近JAVA实训课老师讲了一些Arrarylist集合的相关知识,刚好端午假期有空就把这课上学到的知识和自己碰到的一些问题总结下来. 一.Arrarylist集合的使用(以学生信息存储作为演示) ...
- Python subprocess 使用(一)
Python subprocess 使用(一) 本文主要讲下 subprocess 的简单使用. 1: 通过subprocess 获取设备信息 import subprocess def get_an ...
- 报错信息如下:出现身份验证错误。要求的函数不受支持。可能是由于CredSSP加密数据库修正。
微软官方已出补丁包:CVE-2018-0886 的 CredSSP 更新 Windows Server 2016, all editions.Windows Server 2012 R2 Standa ...
- static、final、private是否可以修饰抽象方法?
1.static和abstract:是不能共存的.static是为了方便调用,abstract是为了给子类重写,没有方法体. 2.final和abstract:是互相冲突的,final修饰的方法不能重 ...
- 昇腾CANN DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶
本文分享自华为云社区<昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈>,作者: 昇腾CANN . 随着人工智能的快速发展,越来越多的应用场 ...
- React Native UI界面还原,组件布局与动画效果
写React Native UI和写 Android XML layout 布局 ,个人感觉是大同小异 在<ReactJS到React-Native,架构原理概述>里面提过 web 环境中 ...
- cxf 动态调用 WebService No compiler detected, make sure you are running on top of a JDK instead of a JRE
WebService cxf No compiler detected, make sure you are running on top of a JDK instead of a JRE [202 ...