zoukankan      html  css  js  c++  java
  • 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern)


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

    示例
    有一个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 += 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

  • 相关阅读:
    TP5.1 分页CSS样式(转载)
    简单的layui二级联动
    关于layui部分表单不显示的问题(Select, checkBox)
    MySQL 开启远程访问权限 | 宝塔系统
    tp5.1 本地正常, 线上route.php不起作用的问题
    cocos自动图集
    微信小程序video
    nuxt https
    接口数据加密
    node里读取命令行参数
  • 原文地址:https://www.cnblogs.com/taotaodetuer/p/6183086.html
Copyright © 2011-2022 走看看