组合模式(Composite Pattern)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/403 访问。

组合模式属于结构型模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

角色:

1、抽象构件(Component )

它是所有叶子构件和容器构件的共同父类,里面声明了叶子构件和容器构件的所有方法;

2、叶子构件(Leaf)

在组合中表示叶子结点对象,叶子结点没有子结点,对于从父类中继承过来的容器构件的方法,由于它不能实现,可以抛出异常;

3、容器构件(Composite)

定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(Attach)和删除(Detach)等。

示例:

命名空间CompositePattern包含文件系统FileSystem基类充当抽象构件类,文件File类充当叶子构件,文件夹Folder类充当容器构件,文件无效操作FileInvalidException 类进行异常处理。本案例尝试通过一个简单的文件系统来向大家阐述组合模式在调用方使用一致性方面的表现。

namespace CompositePattern
public abstract class FileSystem {protected string _name = null;protected const char SPLIT_CHAR_FILE = ' ';protected const char SPLIT_CHAR_DIR = '▼';public FileSystem(string name) {this._name = name;}public abstract FileSystem Attach(FileSystem component);public abstract FileSystem Detach(FileSystem component);public abstract void Print(int depth = 0);}

抽象构件,文件系统FileSystem类。

public class File : FileSystem {public File(string name) : base(name) {}public override FileSystem Attach(FileSystem component) {throw new FileInvalidException("You can not attach a component in a file!");}public override FileSystem Detach(FileSystem component) {throw new FileInvalidException("You can not detach a component from a file!");}public override void Print(int depth = 0) {Console.WriteLine(new string(SPLIT_CHAR_FILE, depth) + _name);}}

叶子构件,文件File类。

public class Folder : FileSystem {private List<FileSystem> _childrens = null;public Folder(string name) : base(name) {_childrens = new List<FileSystem>();}public override FileSystem Attach(FileSystem component) {_childrens.Add(component);return this;}public override FileSystem Detach(FileSystem component) {_childrens.Remove(component);return this;}public override void Print(int depth = 0) {Console.WriteLine(new string(SPLIT_CHAR_DIR, depth) + _name);foreach (var component in _childrens) {component.Print(depth + 1);}}}

容器构件,文件夹Folder类。

public class FileInvalidException : Exception {public FileInvalidException(string message) : base(message) {}public FileInvalidException(string message, Exception innerException): base(message, innerException) {}}

无效的文件操作FileInvalidException类进行简单的异常处理。

public class Program {public static void Main(string[] args) {try {var root = new Folder("Root");var music = new Folder("My Music");music.Attach(new File("Heal the world.mp3")).Attach(new File("When You Say Nothing At All.mp3")).Attach(new File("Long Long Way to Go.mp3")).Attach(new File("Beautiful In White.mp3"));var video = new Folder("My Video");video.Attach(new File("The Shawshank Redemption.avi")).Attach(new File("Schindler's List.avi")).Attach(new File("Brave Heart.avi"));var png = new File("missing.png");root.Attach(png).Detach(png).Detach(png);root.Attach(new File("readme.txt")).Attach(new File("index.html")).Attach(new File("file.cs")).Attach(music).Attach(video).Print();png.Attach(new File("error.json"));}catch (Exception ex) {Console.WriteLine(ex.Message);}Console.ReadKey();}}

以上是调用方的代码,以下是这个案例的输出结果:

Rootreadme.txtindex.htmlfile.cs
▼My MusicHeal the world.mp3When You Say Nothing At All.mp3Long Long Way to Go.mp3Beautiful In White.mp3
▼My VideoThe Shawshank Redemption.aviSchindler's List.aviBrave Heart.avi
You can not attach a component in a file!

优点:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/403 访问。

1、可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易;
2、客户端调用简单,客户端可以一致的使用组合结构或其中单个对象;
3、定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构;
4、更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码。

缺点:

1、使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联;
2、增加新构件时可能会产生一些问题,很难对容器中的构件类型进行限制。

使用场景:

1、你想表示对象的部分-整体层次结构;
2、你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象;
3、对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。

C#设计模式之8-组合模式相关推荐

  1. 组合模式_设计模式结构性:组合模式(CompositePattern)

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  2. JAVA设计模式初探之组合模式

    先看看组合模式的定义吧:"将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性." 就拿剪发办卡的事情来分析一下吧. 首先,一张 ...

  3. 从王者荣耀看设计模式(五.组合模式)

    从王者荣耀看设计模式(组合模式) 一.简介 在王者荣耀这款游戏中,我们可以在商店中购买英雄.英雄由法师.射手.打野等职业组合而成,其中各个职业由中国元素的英雄和外国元素的英雄组成,玩家可根据需要挑选并 ...

  4. 《设计模式》12.组合模式(结构型)

    又称"整体-部分"模式,组合多个对象形成树形结构以表示具有"整体-部分"关系的层次结构,使用户对单个对象和组合对象具有访问一致性. 角色 抽象构件(Compon ...

  5. AVA设计模式初探之组合模式

    先看看组合模式的定义吧:"将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性." 就拿剪发办卡的事情来分析一下吧. 首先,一张 ...

  6. JAVA设计模式十七--Composite(组合模式)

    组合模式 组合模式(Composite Pattern)有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念   ,客户程序可以向处理简单元素一样来处理复杂元素,从而使 ...

  7. 再战设计模式(九)之组合模式

    组合模式 工作流程分析 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子 当容器对象的指定方法被调用时,将遍历整个树形结构,寻 ...

  8. 设计模式(17)之组合模式

    一.前言 在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣服与衣柜.以及厨房中的锅碗瓢盆等.在软件 ...

  9. 设计模式:(组合模式)

    1.定义 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结 ...

  10. 设计模式笔记(9)---组合模式(结构型)

    Gof定义 将对象组合成树形结构以表示"部分--整体"的层次结构.Composite使得用户对单个对象和组合对象使用具有一致性. 在面向对象系统中,我们经常会遇到一类具有" ...

最新文章

  1. springboot整合ElasticSearch出现的问题
  2. 转学美本半年,我眼里的中美高等教育
  3. 一次linux服务器load高达600多的异常处理过程
  4. 硅谷与人工智能的一段风流暧昧史
  5. 一次真实的蓝屏分析 ntkrnlmp.exe
  6. Redis 实用技术——事务
  7. 如何直观的看出主题模型学习结果的好坏
  8. 获取占用fd最大的前20个进程
  9. 拓端tecdat|Python用时变马尔可夫区制转换(Markov regime switching)自回归模型分析经济时间序列
  10. Servlet与JSP项目实战 — 博客系统(上)
  11. Centos开机自动执行shell脚本启动tomcat服务器
  12. 浅谈python爬取数字书苑图书
  13. 超强免费OCR文字识别工具推荐
  14. 三菱PLC通信(MC协议A-1E和Qna-3E模式)
  15. spotbug常见错误心得
  16. Android 播放器 mov,適用於Android的頂級5 MOV播放器應用程序,可在移動設備上播放MOV視頻文件...
  17. PC端浏览器如何访问微信小程序
  18. linux redis5.0 集群搭建
  19. SVG排版 | 深色模式彩蛋
  20. 有什么好用的在线图表制作网站吗?试试这个吧

热门文章

  1. OpenVR——驱动接口之IClientTrackedDeviceProvider简介
  2. Win7下安装配置OpenCV2.3+Visual Studio 2008
  3. 匿名内部类 java 1614965228
  4. 抽象类与抽象方法 c# 1613720553
  5. charles-无法抓取https包的解决办法及效果
  6. Laravel 中使用Goutte + GuzzleHttp 组件设置 headers无效的原因探究以及解决方案
  7. Springboot 整合 Dubbo/ZooKeeper你不知道的那点事,大神必修课
  8. 数加:从数据工程师到CDO的七次升职路
  9. OC中NSString 的常用方法
  10. 《洛克菲勒留给儿子的38封信》 第四封:现在就去做