结构图
公司(抽象类)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系统__组合模式
{
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 ( ) ;
}
}
具体公司类 实现Company接口 树枝节点
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系统__组合模式
{
class ConcreteCompany : Company
{
public ConcreteCompany ( string name) : base ( name)
{
}
private IList< Company> children = new List < Company > ( ) ;
public override void Add ( Company c)
{
children. Add ( c) ;
}
public override void Remove ( Company c)
{
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 company in children)
{
company. LineOfDuty ( ) ;
}
}
}
}
人力资源部 树叶节点(不能向下产生分支)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系统__组合模式
{
class HRDPeartment : Company
{
public HRDPeartment ( string name) : base ( name)
{
}
public override void Add ( Company c)
{
}
public override void DisPlay ( int depth)
{
Console. WriteLine ( new String ( '-' , depth) + name) ;
}
public override void LineOfDuty ( )
{
Console. WriteLine ( "{0} 员工招聘培训管理" , name) ;
}
public override void Remove ( Company c)
{
}
}
}
财务部类 树叶节点(不能向下产生分支)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系统__组合模式
{
class FinanceDepartment : Company
{
public FinanceDepartment ( string name) : base ( name)
{
}
public override void Add ( Company c)
{
}
public override void DisPlay ( int depth)
{
Console. WriteLine ( new String ( '-' , depth) + name) ;
}
public override void LineOfDuty ( )
{
Console. WriteLine ( "{0} 公司财务收支管理" , name) ;
}
public override void Remove ( Company c)
{
}
}
}
客户端调用
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系统__组合模式
{
class Program
{
static void Main ( string [ ] args)
{
ConcreteCompany root = new ConcreteCompany ( "北京责任有限公司" ) ;
root. Add ( new HRDPeartment ( "总公司人力资源部" ) ) ;
root. Add ( new FinanceDepartment ( "总公司财务部" ) ) ;
ConcreteCompany comp = new ConcreteCompany ( "上海华东分公司" ) ;
comp. Add ( new HRDPeartment ( "上海华东分公司资源部" ) ) ;
comp. Add ( new FinanceDepartment ( "上海华东分公司财务部" ) ) ;
root. Add ( comp) ;
ConcreteCompany comp1 = new ConcreteCompany ( "南京办事处" ) ;
comp1. Add ( new HRDPeartment ( "南京办事处人力资源部" ) ) ;
comp1. Add ( new FinanceDepartment ( "南京办事处财务部" ) ) ;
comp. Add ( comp1) ;
ConcreteCompany comp2 = new ConcreteCompany ( "杭州办事处" ) ;
comp2. Add ( new HRDPeartment ( "杭州办事处人力资源部" ) ) ;
comp2. Add ( new FinanceDepartment ( "杭州办事处财务部" ) ) ;
comp. Add ( comp2) ;
Console. WriteLine ( "\n 结构图:" ) ;
root. DisPlay ( 1 ) ;
Console. WriteLine ( "\n 职责" ) ;
root. LineOfDuty ( ) ;
Console. Read ( ) ;
}
}
}
总结:组合模式定义了包含人力资源和财务部这些基本对象和分公司,办事处等组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象 而这个组合对象又可以被组合 这样不断的递归下去 客户端代码中 任何用到基本对象的地方都可以使用组合对象了。
用户不用关心到底是处理一个叶节点还是处理一个组合组件 也就用不着为定义组合而写一些判断语句了。