博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
合成(Composite)模式
阅读量:5172 次
发布时间:2019-06-13

本文共 2761 字,大约阅读时间需要 9 分钟。

一、 合成(Composite)模式

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

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

  从和尚的故事谈起

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

 

二、 合成模式概述

  • 抽象构件(Component)角色:这是一个抽象角色,它给参与组合的对象规定一个接口。这个角色给出共有接口及其默认行为。
  • 树叶构件(Leaf)角色:代表参加组合的树叶对象。一个树叶对象没有下级子对象。
  • 树枝构件(Composite)角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

 

///     /// 结构模式(Structural Pattern)    /// 合成(Composite)模式    /// 合成模式有时又叫做部分-整体模式(Part-Whole)。    /// 合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。    /// 合成模式可以使客户端将单纯元素与复合元素同等看待。    ///     class Program    {        ///         /// 异议        ///         ///         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(1);            Console.ReadLine();        }    }        ///     ///  抽象构件(Component)角色    ///     public abstract class DrawingElement    {        // 字段        protected string name;        // 构造函数        public DrawingElement(string name)        { this.name = name; }        // 方法        abstract public void Display(int indent);    }    ///     /// 树枝构件(Composite)角色    ///     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 + 2); }        }    }    ///     /// 树叶构件(Leaf)角色    ///     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);        }    }

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/dragon-L/p/3688837.html

你可能感兴趣的文章
NOI2018垫底记
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
(转)Tomcat 8 安装和配置、优化
查看>>
(转)Linxu磁盘体系知识介绍及磁盘介绍
查看>>
跨域问题整理
查看>>
[Linux]文件浏览
查看>>
获取国内随机IP的函数
查看>>
Spring Mvc模式下Jquery Ajax 与后台交互操作
查看>>
(转)matlab练习程序(HOG方向梯度直方图)
查看>>
tableView
查看>>
Happy Great BG-卡精度
查看>>
TCP/IP 邮件的原理
查看>>
原型设计工具
查看>>
windows下的C++ socket服务器(4)
查看>>
css3 2d转换3d转换以及动画的知识点汇总
查看>>