合成(Composite)模式
一、 合成(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)模式的更多相关文章
- 合成(composite)模式
合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式 合成模式把部分和整 ...
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- C++基础——模拟事务 (2)Composite模式
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- Composite模式
1 意图:将对象组成树形结构,以表示“部分——整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2 动机:同意处理图元对象和包含图元的容器对象.Composite通过 ...
- Java 实现组合(Composite)模式
类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...
- 【结构型】Composite模式
组合模式意在将对象组合成树形结构以表示部分与整体的层次结构关系,并且用户对单个对象的操作以有对组合对象的操作都是一致的.即:组合对象 is-a 单个对象,同时又可以组合着 n 个的单个对象(甚至于其他 ...
- (原创)composite模式和bridge模式是天生的好朋友
composite模式的意图是:将对象组合成树形结构以表示“部分-整体”的层次结构.composite使得用户对单个对象和组合对象的使用具有一致性.它的类图如下: composite模式的实现分为透明 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...
- 设计模式之——Composite模式
composite模式又叫做组合模式/复合模式. 它是一种能够使容器与内容具有一致性,创造出递归结构的模式. 示例程序是列出文件夹以及其内部文件与文件夹一览的功能: 可以由示例图看出,有一个电影文件夹 ...
- Composite模式 组合模式
Android的ViewGroup 和 View 的关系,即是采用组合模式 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件 ...
随机推荐
- 用Toast来增加调试效率的小技巧
import android.content.Context; import android.widget.Toast; /** * Created by apple on 10/7/15. */ p ...
- 【转】学习使用Jmeter做压力测试(二)--压力测试的实施
JMeter测试步骤: 1.建立测试计划 2.添加线程组 3.添加HTTP请求 4.增加监听器 5.执行测试计划 6.根据JMeter提供的报告分析结果 一.目标 测试访问目标服务器网站首页的每秒查询 ...
- python开发面向对象基础:人狗大战学面向对象
一,通过函数写人狗大战这个故事 #!/usr/bin/env python #_*_coding:utf-8_*_ #1.函数 人模子 def person(name,level,life_value ...
- 2014.8.25 CAD系统事件触发流程
各进近.离场.进场Arinc424数据录入界面在CADDataManager/UC/UCIAP(UCSID)下 UCAirport是一抽象用户控件类,在FormADHP初始化时实例化成airport控 ...
- vc6.0出现“cannot add new member”解决办法
在编辑一个工程的时候,添加一个按钮,对这个按钮产生消息函数 双击按钮之后出现 cannot add new member 网上说删除.clw文件 我发现并没有这个后缀的文件 以下是我的操作办法: ...
- linux grep打印匹配的上下几行
$grep -5 'parttern' inputfile //打印匹配行的前后5行 $grep -C 5 'parttern' inputfile //打印匹配行的前后5行 $grep -A 5 ' ...
- 使用Java进行远程方法调用的几个方案及比较
Java远程方法调用是编程过程中比较常见的问题,列举一下主要包括如下几类: 1.Java RMI (Remote Method Invocation) 2.EJB远程接口调用 3.WebService ...
- 如何将serialport接收的字符串转换成十六进制数c#
关注 baihe_591 baihe_591 本版等级: #1 得分:0回复于: 2008-06-02 09:44:00 Byte[] byte=new Byte[1];byte=0xf1;por ...
- 配置Linux接收H3C路由器日志
(1)H3C Device上的配置 # 开启信息中心. <Sysname> system-view [Sysname] info-center enable # 配置发送日志信息到IP地 ...
- python数据字典的操作
一.什么是字典? 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器 ...