一、 合成(Composite)模式

  合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。

  合成模式可以使客户端将单纯元素与复合元素同等看待。

  从和尚的故事谈起

  这是小时候我奶奶讲的故事:从前有个山,山里有个庙,庙里有个老和尚在给小和尚讲故事,讲的什么故事呢?从前有个山,山里有个庙……。奶奶的故事要循环多少次,根据你多长时间睡着而定。在故事中有山、有庙、有和尚、有故事。因此,故事的角色有两种:一种里面没有其它角色;另一种内部有其它角色。

二、 合成模式概述

  • 抽象构件(Component)角色:这是一个抽象角色,它给参与组合的对象规定一个接口。这个角色给出共有接口及其默认行为。
  • 树叶构件(Leaf)角色:代表参加组合的树叶对象。一个树叶对象没有下级子对象。
  • 树枝构件(Composite)角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。
    /// <summary>
/// 结构模式(Structural Pattern)
/// 合成(Composite)模式
/// 合成模式有时又叫做部分-整体模式(Part-Whole)。
/// 合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。
/// 合成模式可以使客户端将单纯元素与复合元素同等看待。
/// </summary>
class Program
{
/// <summary>
/// 异议
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
// 创建一个树结构
CompositeElement roots = new CompositeElement("Picture");
roots.Add(new PrimitiveElement("Red Line"));
roots.Add(new PrimitiveElement("Blue Circle"));
roots.Add(new PrimitiveElement("Green Box")); CompositeElement comps = new CompositeElement("Two Circles");
comps.Add(new PrimitiveElement("Black Circle"));
comps.Add(new PrimitiveElement("White Circle"));
roots.Add(comps); // 添加和删除PrimitiveElement
PrimitiveElement ls = new PrimitiveElement("Yellow Line");
roots.Add(ls);
roots.Remove(ls); // 递归地显示节点
roots.Display();
Console.ReadLine();
} } /// <summary>
/// 抽象构件(Component)角色
/// </summary>
public abstract class DrawingElement
{
// 字段
protected string name; // 构造函数
public DrawingElement(string name)
{ this.name = name; } // 方法
abstract public void Display(int indent);
} /// <summary>
/// 树枝构件(Composite)角色
/// </summary>
public class CompositeElement : DrawingElement
{
private ArrayList elements = new ArrayList(); // 构造函数
public CompositeElement(string name) : base(name) { } // 方法
public void Add(DrawingElement d)
{ elements.Add(d); } public void Remove(DrawingElement d)
{ elements.Remove(d); } public override void Display(int indent)
{
Console.WriteLine(new String('-', indent) + "+ " + name); // 显示每个子元素节点
foreach (DrawingElement c in elements)
{ c.Display(indent + ); } } }
/// <summary>
/// 树叶构件(Leaf)角色
/// </summary>
public class PrimitiveElement : DrawingElement
{
// 构造函数
public PrimitiveElement(string name) : base(name) { } // 从写函数
public override void Display(int indent)
{
Console.WriteLine(new String('-', indent) + " draw a {0}", name);
} }

合成(Composite)模式的更多相关文章

  1. 合成(composite)模式

    合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式 合成模式把部分和整 ...

  2. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  3. C++基础——模拟事务 (2)Composite模式

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  4. Composite模式

    1 意图:将对象组成树形结构,以表示“部分——整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2 动机:同意处理图元对象和包含图元的容器对象.Composite通过 ...

  5. Java 实现组合(Composite)模式

    类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...

  6. 【结构型】Composite模式

    组合模式意在将对象组合成树形结构以表示部分与整体的层次结构关系,并且用户对单个对象的操作以有对组合对象的操作都是一致的.即:组合对象 is-a 单个对象,同时又可以组合着 n 个的单个对象(甚至于其他 ...

  7. (原创)composite模式和bridge模式是天生的好朋友

    composite模式的意图是:将对象组合成树形结构以表示“部分-整体”的层次结构.composite使得用户对单个对象和组合对象的使用具有一致性.它的类图如下: composite模式的实现分为透明 ...

  8. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...

  9. 设计模式之——Composite模式

    composite模式又叫做组合模式/复合模式. 它是一种能够使容器与内容具有一致性,创造出递归结构的模式. 示例程序是列出文件夹以及其内部文件与文件夹一览的功能: 可以由示例图看出,有一个电影文件夹 ...

  10. Composite模式 组合模式

    Android的ViewGroup 和 View 的关系,即是采用组合模式 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件 ...

随机推荐

  1. apache 2 修改虚拟目录

    准备好环境,就要开始进行开发了.这一篇,我们在Ubuntu Apache上配置虚拟目录. 知识准备: 区别于Windows 下apache,配置文件通常只有一个,就是httpd.conf. Linux ...

  2. c#编写的基于TCP通信的微风IM 版本3 新年新UI

    电商商模 背景:来源,产生运营模式:模式特点,服务对象,业务开展,赢利点,扩 张点,定价策略行业分析:市场分析:DX,企业,政策,经济,文化,技术 网站架构:频道,版块,功能体系 项目推广:地面推广, ...

  3. puclic 页面公共CSS样式

    body, div, dl, dt, dd, ul, ol, li, pre, form, fieldset, blockquote, h1, h2, h3, h4, h5, h6,p{ paddin ...

  4. Java面向对象-递归

    Java面向对象-递归 递归,就是程序调用自身,我们讲的是方法递归调用,也就是在方法里自己调用自己: 我们给出一个案例,求阶乘  1*2*3*...*(n-1)*n 我们用非递归和递归方式分别实现下, ...

  5. JavaScript之BON

    1.windows对象 全局作用域: 2.窗口关系及框架 如果页面包含框架,则每个框架都有自己的window对象,并且保存在iframes集合中,在iframe集合中,可以通过数值索引(从0开始,从左 ...

  6. apache配置多个虚拟主机 localhost访问不了解决方案

    在httpd-vhosts.conf,重定向localhost <VirtualHost *:80>    ServerAdmin webmaster@dummy-host2.exampl ...

  7. 有一些sql 是必须要做笔记的!!

    select CONCAT(unix_timestamp(),"-",id,"-",name) as aa,age from workers; //连接字段 s ...

  8. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial—5.6 向量化 Vectorization

    5.6 向量化 Vectorization 参考视频: 5 - 6 - Vectorization (14 min).mkv 下面是向量化的小例子,如果将所有u(j) .所有v(j).所有w(j)都看 ...

  9. 在java中RandomAccessFile类的作用:对指定文件可以进行读写的操作

  10. zookeeper java api(使用java代码操作zookeeper)

    1 导入相关的pom依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId&g ...