组合模式
组合模式(Composite Pattern),又称之为部分整体模式。将对象组合成树形结果以表示“部分-整体”的层次结果。组合模式使得用户对单个对象的组合对象具有一致性。当需求中国是提现部分与整体层次的结构是,以及希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑组合模式了。
如下所示,一般公司的结构体系就是典型的组合模式范例:
其类结构设计如下:
public abstract class Company
{
protected string name;
protected List<Company> children;
public Company(string name)
{
this.name = name;
children = new List<Company>();
}
public virtual void Add(Company company)
{
children.Add(company);
}
public virtual void Remove(Company company)
{
children.Remove(company);
}
public virtual void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
foreach (var com in children)
{
com.Display(depth + 2);
}
}
/// <remarks>职能</remarks>
public abstract void LineOfDuty();
}
/// <remarks>具体公司</remarks>
public class ConcreteCompany : Company
{
public ConcreteCompany(string name) : base(name)
{
}
public override void LineOfDuty()
{
Console.WriteLine("\n{0} 管理下属部门和公司", this.name);
foreach (var com in children)
{
com.LineOfDuty();
}
}
}
/// <remarks>人力资源部</remarks>
public class HRDepartment : Company
{
public HRDepartment(string name) : base(name)
{
}
public override void LineOfDuty()
{
Console.WriteLine("{0} 员工招聘培训管理", this.name);
}
}
/// <remarks>财务部</remarks>
public class FinanceDepartment : Company
{
public FinanceDepartment(string name) : base(name)
{
}
public override void LineOfDuty()
{
Console.WriteLine("{0} 公司财务收支管理", this.name);
}
}
class Program
{
static void Main(string[] args)
{
ConcreteCompany root = new ConcreteCompany("总部");
root.Add(new HRDepartment("总部人力资源部"));
root.Add(new FinanceDepartment("总部财务部"));
ConcreteCompany company = new ConcreteCompany("西南分公司");
company.Add(new HRDepartment("西南分公司人力资源部"));
company.Add(new FinanceDepartment("西南分公司财务部"));
ConcreteCompany company1 = new ConcreteCompany("成都分公司");
ConcreteCompany company2 = new ConcreteCompany("重庆分公司");
company.Add(company1);
company.Add(company2);
root.Add(company);
company1.Add(new HRDepartment("成都人力资源部"));
company1.Add(new HRDepartment("成都财务部"));
company2.Add(new HRDepartment("重庆人力资源部"));
company2.Add(new HRDepartment("重庆财务部"));
Console.WriteLine("公司结构图:");
root.Display(1);
Console.WriteLine("职责划分:");
root.LineOfDuty();
}
执行结果如下所示:
公司结构图:
-总部
---总部人力资源部
---总部财务部
---西南分公司
-----西南分公司人力资源部
-----西南分公司财务部
-----成都分公司
-------成都人力资源部
-------成都财务部
-----重庆分公司
-------重庆人力资源部
-------重庆财务部
职责划分:
总部 管理下属部门和公司
总部人力资源部 员工招聘培训管理
总部财务部 公司财务收支管理
西南分公司 管理下属部门和公司
西南分公司人力资源部 员工招聘培训管理
西南分公司财务部 公司财务收支管理
成都分公司 管理下属部门和公司
成都人力资源部 员工招聘培训管理
成都财务部 员工招聘培训管理
重庆分公司 管理下属部门和公司
重庆人力资源部 员工招聘培训管理
重庆财务部 员工招聘培训管理
由上述例子可以看出,采用组合模式可以很容易的构建一套树形结构,对于类似这种分上下层次关系的可以考虑采用组合模式的方式来实现。