1.定义
组合模式(Composite Pattern)又叫部分—整体模式,将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
2.理解
组合模式使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。
3.实例
公司管理系统
//公司类 抽象类或接口
abstract class Company
{
protected string name;
public Company (string name)
{
this.name = name;
}
public abstract void Add(Company c);//增加
public abstract void Remove(Company c);//移除
public abstract void Display(int depth);//显示
public abstract void LineOfDuty();//履行职责
}
//具体公司类 实现接口 树枝节点
class ConcreteCompany:Company
{
private List <Company >children=new List<Company> ();
public ConcreteCompany (string name):base(name )
{}
public override void Remove(Company c)
{
children .Remove (c );
}
public override void Add(Company c)
{
children .Add (c );
}
public override void Display(int depth)
{
Console .WriteLine (new string ('-',depth )+name );
foreach (Company component in children )
{
component .Display (depth +2);
}
}
//履行职责
public override void LineOfDuty()
{
foreach (Company component in children )
{
component .LineOfDuty ();
}
}
}
//人力资源部与财务部树叶节点
//人力资源部
class HRDepartment:Company
{
public HRDepartment (string name):base(name )
{ }
public override void Add(Company c)
{
}
public override void Remove(Company c)
{
}
public override void Display(int depth)
{
Console .WriteLine (new String ('-',depth )+name );
}
public override void LineOfDuty()
{
Console .WriteLine ("{0}员工招聘培训管理",name );
}
}
//财务部
class FinanceDepartment:Company
{
public FinanceDepartment (string name):base(name )
{ }
public override void Add(Company c)
{
}
public override void Remove(Company c)
{
}
public override void Display(int depth)
{
Console .WriteLine (new String ('-',depth )+name );
}
public override void LineOfDuty()
{
Console .WriteLine ("{0}公司财务收支管理",name );
}
}
//客户端调用
static void Main(string[] args)
{
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.Add(new HRDepartment("总公司人力资源部"));
root.Add(new FinanceDepartment ("总公司财务部"));
ConcreteCompany comp = new ConcreteCompany("上海华东分公司");
comp.Add(new HRDepartment("华东丰公司人力资源部"));
comp.Add(new FinanceDepartment("华东分公司财务部"));
root.Add(comp);
ConcreteCompany comp1 = new ConcreteCompany("南京办事处");
comp1.Add(new HRDepartment("南京办事处人力资源部"));
comp1.Add(new FinanceDepartment("南京办事处财务部"));
comp.Add(comp1);
ConcreteCompany comp2 = new ConcreteCompany("杭州办事处");
comp2.Add(new HRDepartment("杭州办事处人力资源部"));
comp2.Add(new FinanceDepartment("杭州办事处财务部"));
comp.Add(comp2);
Console.WriteLine("\n结构图:");
root.Display(1);
Console.WriteLine("\n职责");
root.LineOfDuty();
Console.Read();
}
4.优点
组合模式可以让客户一致的使用组合结构和单个对象,组合模式中基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样就不断地递归下去,客户端代码中,任何用到基本对象的地方都可以使用组合对象。用户不用关心到底是处理一个叶节点还是处理一个组合组件,也就用不着为定义组合而写一些选择判断语句了,减少了代码量就减少了维护量和工作量。