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);

............

posted on 2013-08-26 18:02  Kelly_HanShuai  阅读(92)  评论(0)    收藏  举报