1、概述:
在编程的时候,经常会为一个大型企业做系统,一个大型企业里企业结构是很复杂的,比如说,A公司,总公司在北京,在上海、南京、天津等都有分公司,每个分公司下又分为各个办事处,各个分公司和总公司又都分为财务部,市场部等,如果对于这种复杂的企业结构,我们该如何描述呢,这样的设计就用到了组合模式。
2、定义:
将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
3、UML类图:

4、何时使用:
需求中是体现部分与整体层次的结构时,以及希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式。
5、示例代码:
下面我们以公司企业结构为例:
//公司抽象类:
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 ComcreteCompany(string name):base(name){}
public override void Add(Company c)
{
this.children.Add(c);
}
public override void Remove(Company c)
{
this.children.Remove(c);
}
public override void Display(int depth)
{
Console.WriteLine(new String('-',depth)+name);
foreach(Company c in children)
{
c.Display(depth+2);
}
}
//履行职责
public override void LineOfDuty()
{
foreach(Company c in children)
{
c.LineOfDuty();
}
}
}
//树叶节点,真正干活的家伙,Add和Remove为空
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()
{
//叶子节点真正干活的代码
}
}
//财务部
class FinanceDepartment:Company ---------代码和人力资源部差不多,不写了
客户端调用:
ComcreteCompany root =new ConcreteCompany("北京总公司");
root.Add(new HRDepartmenet("总公司人力资源部门");
root.Add(new FinanceDepartment("总公司财务部");
ConcreteCompany comp =new ConcreteCompany("上海分公司");
comp.Add(new HRDepartmenet("海分公司人力资源部门");
comp.Add(new FinanceDepartment("海分公司财务部");
root.Add(comp);
............
浙公网安备 33010602011771号