博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
乐在其中设计模式(C#) - 组合模式(Composite Pattern)
阅读量:7136 次
发布时间:2019-06-28

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

原文:

乐在其中设计模式(C#) - 组合模式(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
参考
OK
你可能感兴趣的文章
设计模式(四)外观模式
查看>>
RadioGroup实现类似ios的分段选择(UISegmentedControl)控件
查看>>
51Nod 1079 中国剩余定理 Label:数论
查看>>
在sql结果中显示行号
查看>>
代码层次
查看>>
python基础一 day11 装饰器复习
查看>>
使用vs code编写Markdown文档以及markdown语法详解
查看>>
asp.net 关闭子窗体 刷新主窗体
查看>>
安全测试===BurpSuite使用教程-附安装包
查看>>
Chrome不能在网易网盘中上传文件的解决办法
查看>>
Axure实现多用户注册验证
查看>>
uva11292-Dragon of Loowater
查看>>
05-表操作
查看>>
实时通讯系列目录篇之SignalR详解
查看>>
Spring aop练手
查看>>
The Suspects-并查集(4)
查看>>
收藏夹代码
查看>>
string 、stringbuffer 、stringbuilder 的区别
查看>>
k-medoids与k-Means聚类算法的异同
查看>>
Linux下安装SVN服务端
查看>>