原文:乐在其中设计模式(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. cocos2dX 之CCParticle

    今天我们来看看粒子特效, 何为粒子特效, 为了模拟燃烧的火焰, 天空飘下来的血环, 滴落的小雨, 这些无规律变化的物体, 我们引进了粒子特效这个名词, 粒子特效的原理是将无数的单个粒子组合使其呈现出固 ...

  2. Linux内核升级

    一.测试环境 CentOS6.5 X86 64位 内核版本为 2.6.32 VM 10.07 二.编译内核版本 2.1.kernel 3.2.71 2.2.kernel 3.4.108 2.3.ker ...

  3. HDU 5009 Paint Pearls (动态规划)

    Paint Pearls Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...

  4. ActivityGroup简单介绍

    ActivityGroup简单介绍 1.ActivityGroup的核心就是继承了该类,可以通过getLocalActivityManager()得到一个LocalActivityManager 如, ...

  5. JavaScript 使用Document记录cookie

    cookie对于我们使用者来说,有时帮助还是挺大的,比方对于一些不是特别重要的站点,比方公司的測试平台,每次登陆都要手动输入username和password 非常繁琐.所以为了更少的引入其他框架,就 ...

  6. IIS7 配置 PHP5.5

    本文环境: 操作系统:Win7(x64) 中文专业版 PHP       :V5.5 首先添加IIS. 控制面板-〉程序-〉打开或关闭Windows功能 1. 勾选“Internet 信息服务”   ...

  7. WPF界面设计技巧(9)—使用UI自动化布局

    原文:WPF界面设计技巧(9)-使用UI自动化布局 最近一直没时间更新这系列文章,因为我一直在埋头编写我的第一个WPF应用程序:MailMail 今天开始编写附属的加密/解密工具,对UI自动化布局有些 ...

  8. Resource temporarily unavailable用户的连接数设置的太小

    -bash:fork:Resource temporarily unavailable的问题   出现这个问题的原因是linux用户的连接数设置的太小,只要修改max user processes就可 ...

  9. cocos2dx 3.1从零学习(六)——CocosStudio(VS2013project导入及环境设置)

    导入libCocosStudio.libExtensions.libGUI 新建的project例如以下图: 加入现有项目 右键解决方式.例如以下操作: watermark/2/text/aHR0cD ...

  10. java枚举的使用

    定义枚举 public enum YesOrNo { YES("是") , NO("否") ; private String text ; private in ...