一、概述

在软件开发中,我们往往会遇上类似树形结构的对象体系。即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在。比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点。在设计这类对象时,如果将叶节点和分支节点区别对待,那么在实际开发中会带来较大的复杂性。比如客户端调用时可能会频繁的使用转型操作,同时代码的可维护性和扩展性也较差。在设计中使用组合模式可以解决这一系列弊端。

二、组合模式

组合模式定义了叶节点和分支节点的一致的接口,将客户端代码与复杂的对象结构解耦,大大降低了客户端调用的复杂性。其结构图如下:

Component定义了所有对象的共同接口,可以在Component中定义管理Component组件的接口以保证一致性,也可以将管理接口下放至Composite中以提高系统调用的安全性。

Leaf表示叶节点。

Composite定义了分支节点对象的行为,并提供一个容器用户存储其子节点。

Client通过Component来处理所有对象。

三、示例

我们利用组合模式来实现一个绘图系统。在该系统中具有Line、Circle、Picture等多种元素,其中Picture可以含有各类子元素。

首先定义Component。

 1     public abstract class Graphic2     {3         private string _name;4 5         public Graphic(string name)6         {7             _name = name;8         }9
10         public abstract void Add(Graphic graphic);
11         public abstract void Remove(Graphic graphic);
12
13         public virtual void Draw()
14         {
15             Console.WriteLine("Draw {0} {1}", GetType().Name, _name);
16         }
17     }

接着定义Picture对象。

 1     public class Picture : Graphic2     {3         private List<Graphic> _graphic = new List<Graphic>();4         public Picture(string name)5             : base(name)6         {7         }8 9         public override void Add(Graphic graphic)
10         {
11             _graphic.Add(graphic);
12         }
13         public override void Remove(Graphic graphic)
14         {
15             _graphic.Remove(graphic);
16         }
17
18         public override void Draw()
19         {
20             base.Draw();
21             foreach (Graphic graphic in _graphic)
22             {
23                 graphic.Draw();
24             }
25         }
26     }

再定义Line和Circle。

 1     public class Line : Graphic2     {3         public Line(string name)4             : base(name)5         {6         }7 8         public override void Add(Graphic graphic)9         {
10             throw new Exception("Line can't add graphic");
11         }
12         public override void Remove(Graphic graphic)
13         {
14             throw new Exception("Line can't remove graphic");
15         }
16     }
17
18     public class Circle : Graphic
19     {
20         public Circle(string name)
21             : base(name)
22         {
23         }
24
25         public override void Add(Graphic graphic)
26         {
27             throw new Exception("Circle can't add graphic");
28         }
29         public override void Remove(Graphic graphic)
30         {
31             throw new Exception("Circle can't remove graphic");
32         }
33     }

这样就可以通过统一的Draw接口画出整幅图画。

C#设计模式——组合模式(Composite Pattern)相关推荐

  1. 设计模式:组合模式(Composite Pattern)

    组合模式: 又叫部分整体模式, 它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系. JDK中的HashMap就使用了组合模式 public abstra ...

  2. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  3. Java设计模式 —— 组合模式(Composite)

    Java设计模式 -- 组合模式(Composite) 定义 Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. ...

  4. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

  5. 24组合模式(Composite Pattern)

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

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

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初识组合 ...

  7. 组合模式(Composite Pattern)

    组合模式概述 定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式让客户端可以统一对待单个对象和组合对象.又被成为"部分-整体"(Part-Whole)模式, ...

  8. 组合模式测试组合模式(Composite Pattern)

    改章节是一篇关于组合模式测试的帖子 像一个树形结构一样使用基本的对象和自己本身构建一个复杂的对象,称为组合模式. 这类模式很轻易学习以及应用到某个系统中.组合模式属于结构设计模式之一,比拟常用.经典的 ...

  9. 组合模式-Composite Pattern

    目录 组合模式的定义与特点 组合模式的结构与实现 组合模式的应用实例 组合模式的应用场景 组合模式的扩展 树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构 ...

最新文章

  1. c语言通过域组策略下发软件,windows 2008 server 域环境通过组策略下发计划任务(示例代码)...
  2. 一文学会基于R的静态和动态网络绘制
  3. ARCore中根据屏幕坐标计算射线的算法
  4. python面向对象编程的优点-Python面向对象编程——总结面向对象的优点
  5. Xml转换成view的原理
  6. C++函数模板Demo - win32 版
  7. 查看torch依赖的cuda版本_torch多GPU情况下模型建立遇到的问题
  8. 如何与深度学习服务器优雅的交互?(长期更新)
  9. linux nginx http cache时间不对,Linux中Nginx设置proxy_cache缓存与取消缓存-linux-操作系统-壹...
  10. 【数字逻辑设计】Logisim构建四位行波进位加法/减法器
  11. fidde调试手机_实操:手机上用Fiddler调试页面(嘎)
  12. 【HNOI2006】【Luogu2320】鬼谷子的钱袋(进制,玄学)
  13. vue cli3 项目中解决跨域
  14. 用excel做线性规划
  15. Win10 删除 微软输入法
  16. 通过IMAP方式迁移U-Mail邮件到Exchange 2013之Umail搭建!
  17. android pad的屏幕纯多少,16:9比例10.1寸屏幕,Galaxy Tab S4可以说是一部好的安卓平板...
  18. spss python_ARIMA模型 - [SPSS Python]
  19. 高级性能测试系列《34.普通性能场景:​jmeter的线程数,有没有限制?线程数+ramp-up时间,怎么设置才比较合理?》...
  20. Linux PXE无盘工作站

热门文章

  1. android 神气插件 自动补全tabnine
  2. 基于FPGA的图像平滑处理
  3. 【Dash搭建可视化网站】项目1:使用Dash创建简单网页
  4. ios12 siri 语音识别
  5. 恶意融资与上市公司的股权结构研究
  6. 北航宇航学院计算机,2014年北航自动化考生倾情奉献的总结(也试用于宇航学院)...
  7. ASEMI整流桥GBU808参数,GBU808介绍,GBU808详解
  8. Mac电脑高手都会用的10个Mac OS实用技巧,都是干货值得收藏!
  9. 关于babe-loader^8.0.6的配置问题
  10. Windows运维之道——PXE备份系统