原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern)

[索引页][源码下载]

乐在其中设计模式(C#) - 组合模式(Composite Pattern)

作者:webabcd





介绍

将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。





示例

有一个Message实体类,使其单个对象和复合对象具有一致性。







MessageModel

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Composite

{

    /**//// <summary>

    /// Message实体类

    /// </summary>

    public class MessageModel

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="msg">Message内容</param>

        /// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)

        {

            this._message = msg;

            this._publishTime = pt;

        }



        private string _message;

        /**//// <summary>

        /// Message内容

        /// </summary>

        public string Message

        {

            get { return _message; }

            set { _message = value; }

        }



        private DateTime _publishTime;

        /**//// <summary>

        /// Message发布时间

        /// </summary>

        public DateTime PublishTime

        {

            get { return _publishTime; }

            set { _publishTime = value; }

        }

    }

}

MessageModelComponent

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Composite

{

    /**//// <summary>

    /// 抽象Message实体构件(Component)

    /// </summary>

    public abstract class MessageModelComponent

    {

        /**//// <summary>

        /// Message实体对象

        /// </summary>

        protected MessageModel _messageModel;



        /**//// <summary>

        /// 名称

        /// </summary>

        protected string _name;



        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="name">名称</param>

        /// <param name="mm">Message实体对象</param>

        public MessageModelComponent(string name, MessageModel mm)

        {

            this._name = name;

            this._messageModel = mm;

        }



        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="name">名称</param>

        public MessageModelComponent(string name)

        {

            this._name = name;

        }



        /**//// <summary>

        /// 添加

        /// </summary>

        /// <param name="mmc">MessageModelComponent</param>

        public abstract void Add(MessageModelComponent mmc);



        /**//// <summary>

        /// 删除

        /// </summary>

        /// <param name="mmc">MessageModelComponent</param>

        public abstract void Remove(MessageModelComponent mmc);



        /**//// <summary>

        /// 获取

        /// </summary>

        /// <param name="indent">缩进数</param>

        /// <returns></returns>

        public abstract string GetData(int indent);

    }

}

MessageModelLeaf

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Composite

{

    /**//// <summary>

    /// Message实体树叶(Leaf)

    /// </summary>

    public class MessageModelLeaf : MessageModelComponent

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="name">名称</param>

        /// <param name="mm">Message实体对象</param>

        public MessageModelLeaf(string name, MessageModel mm)

            : base(name, mm)

        {

            

        }



        /**//// <summary>

        /// 添加

        /// </summary>

        /// <param name="mmc">MessageModelComponent</param>

        public override void Add(MessageModelComponent mmc)

        {

            throw new Exception("不能添加");

        }



        /**//// <summary>

        /// 删除

        /// </summary>

        /// <param name="mmc">MessageModelComponent</param>

        public override void Remove(MessageModelComponent mmc)

        {

            throw new Exception("不能删除");

        }



        /**//// <summary>

        /// 获取

        /// </summary>

        /// <param name="indent">缩进数</param>

        /// <returns></returns>

        public override string GetData(int indent)

        {

            return new String('—', indent) + 

                "树叶名称:" + _name + 

                ";信息内容:" + _messageModel.Message + 

                "<br />";

        }

    }

}

MessageModelComposite

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Composite

{

    /**//// <summary>

    /// Message实体树枝(Composite)

    /// </summary>

    public class MessageModelComposite : MessageModelComponent

    {

        private List<MessageModelComponent> _list;



        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="name">名称</param>

        public MessageModelComposite(string name)

            : base(name)

        {

            _list = new List<MessageModelComponent>();

        }



        /**//// <summary>

        /// 添加

        /// </summary>

        /// <param name="mmc">MessageModelComponent</param>

        public override void Add(MessageModelComponent mmc)

        {

            _list.Add(mmc);

        }



        /**//// <summary>

        /// 删除

        /// </summary>

        /// <param name="mmc">MessageModelComponent</param>

        public override void Remove(MessageModelComponent mmc)

        {

            _list.Remove(mmc);

        }



        /**//// <summary>

        /// 获取

        /// </summary>

        /// <param name="indent">缩进数</param>

        /// <returns></returns>

        public override string GetData(int indent)

        {

            string s = new String('—', indent) + 

                "树枝名称:" + _name + 

                "<br />";



            foreach (MessageModelComponent mmc in _list)

            {

                s );

            }



            return s;

        }

    }

}

Test

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;



using Pattern.Composite;



public partial class Composite : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        MessageModelComposite root = new MessageModelComposite("树枝A");



        root.Add(new MessageModelLeaf("树叶A", new MessageModel("Message内容A", DateTime.Now)));

        root.Add(new MessageModelLeaf("树叶B", new MessageModel("Message内容B", DateTime.Now)));



        MessageModelComposite comp = new MessageModelComposite("树枝B");



        comp.Add(new MessageModelLeaf("树叶C", new MessageModel("Message内容C", DateTime.Now)));

        comp.Add(new MessageModelLeaf("树叶D", new MessageModel("Message内容D", DateTime.Now)));



        root.Add(comp);



        root.Add(new MessageModelLeaf("树叶E", new MessageModel("Message内容E", DateTime.Now)));



        MessageModelLeaf l = new MessageModelLeaf("树叶F", new MessageModel("Message内容F", DateTime.Now));

        

        root.Add(l);

        root.Remove(l);



        Response.Write(root.GetData());

    }

}

运行结果

—树枝名称:树枝A

———树叶名称:树叶A;信息内容:Message内容A

———树叶名称:树叶B;信息内容:Message内容B

———树枝名称:树枝B

—————树叶名称:树叶C;信息内容:Message内容C

—————树叶名称:树叶D;信息内容:Message内容D

———树叶名称:树叶E;信息内容:Message内容E





参考

http://www.dofactory.com/Patterns/PatternComposite.aspx





OK

[源码下载]

乐在其中设计模式(C#) - 组合模式(Composite Pattern)的更多相关文章

  1. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  2. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  3. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

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

    1.模式动机 很多时候会存在"部分-整体"的关系,例如:大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.在软件开发中也是这样,例如,文件系统中的文件与文件夹.窗体 ...

  5. 设计模式系列之组合模式(Composite Pattern)——树形结构的处理

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

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

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

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

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

  8. java_设计模式_组合模式_Composite Pattern(2016-08-12)

    概念: 组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 有时候又叫做部分-整体模式,它使我们树 ...

  9. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

随机推荐

  1. [Xcode]使用target进行协同开发

    协同开发时候发现难免会因为某些条件宏导致上传到SVN的代码影响到其他同时,但是每一次去修很多条件编译也不是很方便,所以可以通过新建自己的target来控制product. 一.创建自己的target: ...

  2. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  3. nginx fastcgi 自定义错误页面

    http{ fastcgi_intercept_errors on; error_page 404 /404.html; } fastcgi_intercept_errors on;必须设置 之后通过 ...

  4. C++技术问题总结-第11篇 网络通信中主机序网络序

    网络通信常常涉及到字节序转化,接下来理解主机序和网络序有什么异同. ①主机字节顺序HBO(Host Byte Order) 採用小头序(little-endian),从低到高的顺序存储. 低位字节排放 ...

  5. poj3237(树链剖分)

    题目链接:http://poj.org/problem?id=3237 题目大意:指定一颗树上有3个操作: 1)询问操作,询问a点和b点之间的路径上最长的那条边的长度(即最大值): 2)取反操作,将a ...

  6. hdu2036 (计算多边形的面积)

    Input 输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1 ...

  7. Java算法分析1—————寻找数组同样元素

    算法的两个评測指标:执行时间和内存消耗 要么用时间换空间,要么用空间换时间 寻找数组同样元素測试一: 0~99共100个元素各不同样,新增加一个0~99的元素不明白位置 从101个元素数组中找出与0~ ...

  8. Jquery 对话框确认

    $("#aa").click(function(){ if(confirm("是否继续")){ $(#aa).fadeOut(500); } })

  9. 游戏开发实验室的内部讲座总结----c++

     第三节  动态内存分配new和delete 经过调试设置断点,发现new 函数事实上还是调用的malloc函数. 第四节  引用 一个变量是能够有多个引用的,引用也是能够传递的.  常量是不能有 ...

  10. 每日回顾Shell —cat,tail,head

    Shell中常常会用到cat命令.可是总是不是特别清楚: cat命令的用途是连接文件或标准输入并打印. 这个命令经常使用来显示文件内容.或者将几个文件连接起来显示.或者从标准输入读取内容并显示,它常与 ...