二十四种设计模式:组合模式(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

posted @ 2016-12-15 14:17  Richfiter  阅读(253)  评论(0编辑  收藏  举报