**组合模式:**将对象组合成树形结构以表示”部分—整体“的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式理解
组合模式就是当我们所要处理的事件,存在层级关系,并且各个层级所要处理的事件所要应用的方法其实是一样的时候,我们就要应用到组合模式了。
就比如,一个大公司,有多个分公司。大公司人员管理部门和财务管理部门。分公司也有人员管理部门和财务管理部门。
在上面这个例子中大公司和分公司存在层级关系,而大公司和分公司的人员管理部门和财务管理部门的职能是相同的。
何时使用组合模式
当需求中体现部分与整体层次的结构时,以及希望用户可以忽略组合对象(总公司)与单个对象(分公司)的不同,统一的使用组合对象中的所有对象(人员管理部门和财务管理部门)时,就应该考虑用组合模式
组合模式的优点
因为组合模式中不管是组合对象还是单个对象,他们所拥有的功能是一样的,所以都能解决客户的问题。
第一步建立公司类抽象接口
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 Add(Company c)
{
children.Add(c);
}
//移除子公司或者部门
public override void Remove(Company c)
{
children.Remove(c);
}
//遍历数组children
public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
foreach (var component in children )
{
component.Display(depth + 2);
}
}
//显示部门职责
public override void LineOfDuty()
{
foreach (var company in children )
{
company.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.ReadKey();
}
最终结果
结构图
-北京总公司
—总公司人力资源部
—总公司财务部
—上海华东公司
-----上海华东公司人力资源部
-----上海华东公司财务部
-----南京办事处
-------南京办事处人力资源部
-------南京办事处财务部
-----杭州办事处
-------杭州办事处人力资源部
-------杭州办事处财务部
职责
总公司人力资源部员工招聘培训管理
总公司财务部公司财务收支管理
上海华东公司人力资源部员工招聘培训管理
上海华东公司财务部公司财务收支管理
南京办事处人力资源部员工招聘培训管理
南京办事处财务部公司财务收支管理
杭州办事处人力资源部员工招聘培训管理
杭州办事处财务部公司财务收支管理