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

  • 相关阅读:
    mysql常用函数
    主程Ry访谈录
    mongodb spring anno 查询
    mongodb 查询少少优化
    jquery table thead drop
    ubuntu 配置java,eclipse ,flex,zend,php,TomCat环境
    mongodb shell
    TCP/IP Sockets in Java 源码
    java 断点下载
    直线生成 DDA
  • 原文地址:https://www.cnblogs.com/taotaodetuer/p/6183086.html
Copyright © 2011-2022 走看看