返回目录

何时能用到它?

组合模式又叫部分-整体模式,在树型结构中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。对于今天这个例子来说,它可以很清楚的说明组合模式的用意,首先是一个Graphics对象,它表示是一绘图功能(树根),而circle,line和rectangle分别是简单的图形,它们内部不能再有其它图形了(相当于树叶),而picture是一个复杂图形,它由circle,line和rectangle组成(相当于树枝),而它对外将这些子对象隐藏了,只对外公开了add和remove方法,用来向picture内部添加简单对象。

组合模式的结构图

aaarticlea/png;base64,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" alt="" />

组合模式实现说明

Graphics:图像基类,所以和图像有关的类都继承它

Picture:照片,它由一些简单图形组成

Circle:简单图形-圆

Line:简单图形-线

Rectangle:简单图形-矩形

组合模式的C#实现

#region 组合模式
/// <summary>
/// 图像基类,所以和图像有关的类都继承它
/// </summary>
public abstract class Graphics
{
protected string _name; public Graphics(string name)
{
this._name = name;
}
public abstract void Draw();
}
/// <summary>
/// 照片,它由一些简单图形组成
/// </summary>
public class Picture : Graphics
{
protected ArrayList picList = new ArrayList(); public Picture(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString()); foreach (Graphics g in picList)
{
g.Draw();
}
} public void Add(Graphics g)
{
picList.Add(g);
}
public void Remove(Graphics g)
{
picList.Remove(g);
}
}
/// <summary>
/// 简单图形-线
/// </summary>
public class Line : Graphics
{
public Line(string name)
: base(name)
{ } public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
}
/// <summary>
/// 简单图形-圆
/// </summary>
public class Circle : Graphics
{
public Circle(string name)
: base(name)
{ } public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
}
/// <summary>
/// 简单图形-矩形
/// </summary>
public class Rectangle : Graphics
{
public Rectangle(string name)
: base(name)
{ } public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
} #endregion

调用代码

           #region 组合模式调用
Picture root = new Picture("Root"); root.Add(new Line("Line"));
root.Add(new Circle("Circle")); Rectangle r = new Rectangle("Rectangle");
root.Add(r); root.Draw();
#endregion

屏幕截图

aaarticlea/png;base64,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" alt="" />

通过上面的图我们可以发展,这个picture图像,它由一条线,一个圆和一个矩形组成。

返回目录

说说设计模式~组合模式(Composite)的更多相关文章

  1. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  2. 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释

    组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...

  3. 设计模式组合模式(Composite)精华

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建 ...

  4. 设计模式 -- 组合模式 (Composite Pattern)

    定义: 对象组合成部分整体结构,单个对象和组合对象具有一致性. 看了下大概结构就是集团总公司和子公司那种层级结构. 角色介绍: Component :抽象根节点:其实相当去总公司,抽象子类共有的方法: ...

  5. 设计模式--组合模式Composite(结构型)

    一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...

  6. C#设计模式——组合模式(Composite Pattern)

    一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...

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

    一.概念 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.模式动机 组合模式,通过设计一个抽像的组件类,使它既代表叶子对象,又代表组合对 ...

  8. 大话设计模式--组合模式 Composite -- C++实现实例

    1. 组合模式: 将对象组合成树形结构以表示"部分--整体"的层次结构,组合模式使用户对单个对象和组合对象的使用具有一致性. 需求中是体现部分与整体层次的结构时,希望用户可以忽略组 ...

  9. 设计模式(七)组合模式Composite(结构型)

    设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...

随机推荐

  1. 最小生成树算法——Kruskal算法

    #include<stdio.h> #include<algorithm> #include<windows.h> using namespace std; str ...

  2. Unity3D将来时:WebGL

    作者:小玉链接:https://zhuanlan.zhihu.com/p/19974794来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 随着Unity5.0的发布,W ...

  3. iOS基础之Xcode 8相关

    1.屏蔽日志输出 2.注释相关 注释不能使用:命令运行:  sudo /usr/libexec/xpccachectl  VVDocument方式注释快捷键:option + command + /

  4. 五步搞定Android开发环境部署

    引言   在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入 Android浪潮的朋友们,为了确保大家能顺利完成开发 ...

  5. 【动态规划】bzoj1663 [Usaco2006 Open]赶集

    http://blog.csdn.net/u011265346/article/details/44906469 #include<cstdio> #include<algorith ...

  6. 一台MySQL服务器启动多个端口

    一台MySQL服务器启动多个端口 在测试Mysql多主一从服务器,即一个从服务器多端口同步不同主库.本文记录了开启不同端口的操作. 详细步骤: 1.首先要先把my.cnf配置文件复制一份,开几个端口要 ...

  7. iis6|iis7|配置URLRewriter|64位操作系统下|.net2.0|.net4.0|配置URLRewriter|Web.config配置详情

    想必很多ASP.NET的码友们在IIS配置伪静态被严重纠结过不止一次两次,本园主经过多次站点伪静态配置,总结了一下,IIS版本:IIS 6.IIS 7,服务器:Windows Server 2003. ...

  8. yeoman(转)

    前言有一种技术可以提高我们的工作效率,可以让我们专心做我们擅长的事,可以屏蔽复杂性,可以规范我们的架构和我们的代码,可以让我们的享受编程的乐趣.Yeoman可以做到. 很多年以前,rails刚刚出世, ...

  9. 用js实现瀑布流的一种简单方法

    现在说瀑布流式布局似乎有点晚了,但是每一项技术都是向着“精”和“简”的方向在不断发展,在发展到极致之前,需要一个相当漫长的过程,因此,从这个角度来说,当瀑布流被应用得越来越多的时候,反而更应该讨论它, ...

  10. c# WebBrower 与 HttpRequest配合 抓取数据

    今天研究一个功能,发现一个问题. 通过webbrower模拟用户自动登录可以完成,并且可以取到相对应的页面内容. 但是如果页面中通过ajax,动态加载的内容,这种方式是取不到的,于是用到了httpRe ...