博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二十四种设计模式:组合模式(Composite Pattern)
阅读量:6087 次
发布时间:2019-06-20

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

组合模式(Composite Pattern)

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

  MessageModel

using System;using System.Collections.Generic;using System.Text;namespace Pattern.Composite{    ///     /// Message实体类    ///     public class MessageModel    {        ///         /// 构造函数        ///         /// Message内容        /// Message发布时间        public MessageModel(string msg, DateTime pt)        {            this._message = msg;            this._publishTime = pt;        }        private string _message;        ///         /// Message内容        ///         public string Message        {            get { return _message; }            set { _message = value; }        }        private DateTime _publishTime;        ///         /// Message发布时间        ///         public DateTime PublishTime        {            get { return _publishTime; }            set { _publishTime = value; }        }    }}

  MessageModelComponent

using System;using System.Collections.Generic;using System.Text;namespace Pattern.Composite{    ///     /// 抽象Message实体构件(Component)    ///     public abstract class MessageModelComponent    {        ///         /// Message实体对象        ///         protected MessageModel _messageModel;        ///         /// 名称        ///         protected string _name;        ///         /// 构造函数        ///         /// 名称        /// Message实体对象        public MessageModelComponent(string name, MessageModel mm)        {            this._name = name;            this._messageModel = mm;        }        ///         /// 构造函数        ///         /// 名称        public MessageModelComponent(string name)        {            this._name = name;        }        ///         /// 添加        ///         /// MessageModelComponent        public abstract void Add(MessageModelComponent mmc);        ///         /// 删除        ///         /// MessageModelComponent        public abstract void Remove(MessageModelComponent mmc);        ///         /// 获取        ///         /// 缩进数        /// 
public abstract string GetData(int indent); }}

  MessageModelLeaf

using System;using System.Collections.Generic;using System.Text;namespace Pattern.Composite{    ///     /// Message实体树叶(Leaf)    ///     public class MessageModelLeaf : MessageModelComponent    {        ///         /// 构造函数        ///         /// 名称        /// Message实体对象        public MessageModelLeaf(string name, MessageModel mm)            : base(name, mm)        {                    }        ///         /// 添加        ///         /// MessageModelComponent        public override void Add(MessageModelComponent mmc)        {            throw new Exception("不能添加");        }        ///         /// 删除        ///         /// MessageModelComponent        public override void Remove(MessageModelComponent mmc)        {            throw new Exception("不能删除");        }        ///         /// 获取        ///         /// 缩进数        /// 
public override string GetData(int indent) { return new String('—', indent) + "树叶名称:" + _name + ";信息内容:" + _messageModel.Message + "
"; } }}

  MessageModelComposite

using System;using System.Collections.Generic;using System.Text;namespace Pattern.Composite{    ///     /// Message实体树枝(Composite)    ///     public class MessageModelComposite : MessageModelComponent    {        private List
_list; ///
/// 构造函数 /// ///
名称 public MessageModelComposite(string name) : base(name) { _list = new List
(); } ///
/// 添加 /// ///
MessageModelComponent public override void Add(MessageModelComponent mmc) { _list.Add(mmc); } ///
/// 删除 /// ///
MessageModelComponent public override void Remove(MessageModelComponent mmc) { _list.Remove(mmc); } ///
/// 获取 /// ///
缩进数 ///
public override string GetData(int indent) { string s = new String('—', indent) + "树枝名称:" + _name + "
"; foreach (MessageModelComponent mmc in _list) { s += mmc.GetData(indent + 2); } 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(1));    }}

  运行结果

  —树枝名称:树枝A
  ———树叶名称:树叶A;信息内容:Message内容A
  ———树叶名称:树叶B;信息内容:Message内容B
  ———树枝名称:树枝B
  —————树叶名称:树叶C;信息内容:Message内容C
  —————树叶名称:树叶D;信息内容:Message内容D
  ———树叶名称:树叶E;信息内容:Message内容E

转载于:https://www.cnblogs.com/taotaodetuer/p/6183086.html

你可能感兴趣的文章
PHP初级函数1
查看>>
使用kubeadm部署k8s集群00-缓存rpm包
查看>>
十三章脚本控制
查看>>
LAMP_FPM模式方式
查看>>
vm lnmp母盘制作过程
查看>>
textarea 在浏览器中固定大小和禁止拖动
查看>>
对英语的成分理解
查看>>
编译安装Apache+PHP
查看>>
关于类的入门的例子(6): 类引用示例
查看>>
java基础——random小例子(生成22选5×××)
查看>>
JSON 之 SuperObject(14): 从 XML 中解析
查看>>
系统默认语言与系统支持的语言列表
查看>>
windows2003下ISA防火墙的安装及简单配置
查看>>
【Kafka】《Kafka权威指南》入门
查看>>
存储过程中有个DEFINER
查看>>
Linux下用Sendmail搭建简单邮件服务器
查看>>
display:list-item,不需要有ul,ol,li等列表标签也能排布列表格局
查看>>
ztr loves lucky numbers(STL)
查看>>
Microsoft Azure Remoteapp预览
查看>>
前端开发者指南(2017)
查看>>