C#设计模式之合成模式介绍
Composite模式定义了单个对象和组合对象的类层次结构。(1)单个对象组合成复杂的组合对象,而多个组合对象又可以被组合成一个新的组合对象。其中,一个组合对象中的某些对象可能包容了其他对象。某些对象则表现单个基本对象,称为叶对象;某些对象代表一组对象,称为枝对象。叶对象可以组合成复杂的枝对象,而枝对象又可以被组合成新的枝对象,可以不断组合下去。
Composite模式使用户对单个对象和组合对象的使用具有一致性。客户可以一致地使用组合结构和单个对象,而不用关心处理的是一个叶节点还是一个组合组件。Composite关键是一个抽象类,这个类既可以代表一个对象,也可以代表一个容器来包含一组对象。(1)那么。Composite关键两个思想:
一、一个Composite对象既可包容Leaf对象,也可以其他包容Composite对象。
二、一个Leaf类和一个Composite共享一个在抽象类中定义的公共接口Component。(2)
在以下情况下考虑使用合成模式:
(1)表示对象的部分和整体层次结构
(2)忽略枝对象和叶对象的不同,用户同意使用组合结构的所有对象。
结构图如下:
合成模式的实现根据公共接口Component的区别分为两种形式,分别称为安全模式和透明模式。
透明模式:
公共接口Component中里面声明所有的用来管理子类对象的方法,包括Add()、Remove(),以及GetChild()方法。这样所有的叶对象和枝对象都有相同的接口,那么客户端可以将叶对象和枝对象同等对待而不用区分。
示例代码如下:
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceComposite
{
///<summary>
///透明模式
///一个Leaf类和一个Composite共享一个在抽象类中定义的公共接口
///</summary>
publicinterfaceITransparence
{
///<summary>
///获得学生的总成绩
///</summary>
///<returns>返回学生的总成绩</returns>
intGetStudentScores();
///<summary>
///获得学生的所有科目名称
///</summary>
///<returns>返回学生的所有科目名称</returns>
stringGetStudentSubjects();
///<summary>
///增加叶节点
///</summary>
///<paramname="transparence">接口类型对象</param>
///<returns>操作是否成功</returns>
boolAdd(ITransparencetransparence);
///<summary>
///移除叶节点
///</summary>
///<paramname="transparence">接口类型对象</param>
///<returns>操作是否成功</returns>
boolRemove(ITransparencetransparence);
///<summary>
///获得所有的子节点
///</summary>
///<returns></returns>
List<ITransparence>GetChild();
}
///<summary>
///学生叶子节点
///</summary>
publicclassStudentLeaf:ITransparence
{
///<summary>
///语文
///</summary>
privatestring_chinese;
///<summary>
///数学
///</summary>
privatestring_math;
///<summary>
///英语
///</summary>
privatestring_english;
///<summary>
///语文成绩
///</summary>
privateint_chineseScore;
///<summary>
///数学成绩
///</summary>
privateint_mathScore;
///<summary>
///英语成绩
///</summary>
privateint_englishScore;
///<summary>
///构造函数:语文,数学,英语的中文名称和它的分数
///</summary>
///<paramname="chinese"></param>
///<paramname="math"></param>
///<paramname="english"></param>
publicStudentLeaf(stringchinese,stringmath,stringenglish,intchineseScore,intmathScore,intenglishScore)
{
_chinese=chinese;
_math=math;
_english=english;
_chineseScore=chineseScore;
_mathScore=mathScore;
_englishScore=englishScore;
}
///<summary>
///获得某个学生总成绩
///</summary>
///<returns></returns>
publicintGetStudentScores()
{
intscores=_chineseScore+_mathScore+_englishScore;
returnscores;
}
///<summary>
///获得某个学生的所有科目名称
///</summary>
///<returns></returns>
publicstringGetStudentSubjects()
{
StringBuildersb=newStringBuilder();
sb.Append("语文:");
sb.Append(_chinese);
sb.Append(" ");
sb.Append("数学:");
sb.Append(_math);
sb.Append(" ");
sb.Append("英语:");
sb.Append(_english);
sb.Append(" ");
returnsb.ToString();
}
///<summary>
///增加叶节点
///</summary>
///<paramname="transparence">接口类型对象</param>
///<returns>操作是否成功</returns>
publicboolAdd(ITransparencetransparence)
{
//叶子节点不能使用该方法
returnfalse;
}
///<summary>
///移除叶节点
///</summary>
///<paramname="transparence">接口类型对象</param>
///<returns>操作是否成功</returns>
publicboolRemove(ITransparencetransparence)
{
//叶子节点不能使用该方法
returnfalse;
}
///<summary>
///获得所有的子节点
///</summary>
///<returns></returns>
publicList<ITransparence>GetChild()
{
returnnull;
}
}
///<summary>
///学生合成类
///</summary>
publicclassStudentComposite:ITransparence
本文地址:http://www.45fan.com/a/question/71502.html