合成(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:文件 ...
随机推荐
- linux字符界面下root用户无法登录成功
os: rhel5.6_x86_64 ———————————————————————————————————————————— 故障:图形界面登录正常,其他一切正常,但是切换到字符界面时,输入用户ro ...
- PL/Sql developer安装,设置
安装PL/Sql developer,和安装出现错误(oracle client not properly installed),pl/sql中文乱码 下载安装plsql_dev(文末有64位的百度云 ...
- Jmeter录制HTTPS 补充
Jmeter有录制功能,录制HTTPs需要增加一个证书配置,录制步骤如下: 1.打开jmeter,添加线程组.线程组右键,逻辑控制器>录制控制器 工作台 右键 非测试元件 >HTTP代理服 ...
- python开发函数进阶:匿名函数
一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...
- 第三章 深入分析Java Web中的中文编码问题
3.1 几种常见的编码格式 3.1.1 为什么要编码 一个字节 byte只能表示0~255个符号,要表示更多的字符,需要编码. 3.1.2 如何翻译 ASCII码:有128个,用一个字节的低7位表示. ...
- spring-boot多环境配置文件
spring-boot多环境配置文件 目录 配置 多环境配置文件名称要遵循格式 application-{profile}.yml application.yml spring: profiles: ...
- leetcode318
public class Solution { public int MaxProduct(string[] words) { ) { ; } int len = words.Length; int[ ...
- 【知识结构】最强Thymeleaf知识体系
在开发一个小项目的时候,使用的是Spring Boot,Spring Boot 官方推荐的前端模板是thymeleaf, 花了两天时间将官方的文档看完并总结了下知识体系结构.转载请注明出处,https ...
- BurpSuite—-Sequencer模块(定序器)
一.简介 Burp Sequencer是一种用于分析数据项的一个样本中的随机性质量的工具.你可以用它来测试应用程序的session tokens(会话tokens)或其他重要数据项的本意是不可预测的, ...
- Linux 2.6.32内核字符设备驱…
引言:Linux驱动中,字符设备的设计一般会占产品驱动开发的90%以上,作者根据驱动开发的实际经验,总结了一个标准的字符设备驱动的模板,仅供参考. //=======================字 ...