组合模式(Composite)模式定义:将对象组合成树形结构以表示"部分—整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
使用场景:
- 体现部分与整体层次的结构时
- 忽略组合对象与单个越想的不同,统一的使用组合结构中的所有对象 (整体和部分可以被一致对待)
分类:
- 透明方式:子继承父,并具备父类所有方法,这样子类与子类之间对于外界没有区别,具备完全一致的行为接口(允许重写的方法无意义)。
- 安全方式 :子类1继承父,不去声明无意义的方法;子类2继承父,能声明所有父类方法且有意义,这里子类1和子类2具有不同的接口,客户端调用时需要做相应的判断。
- 代码背景:总公司和分公司共用一套管理系统,无论是总公司还是分公司都有人力和财务部门,一个系统全公司使用,要求分清结构且功能一致。
抽象公司类:有添加删除下属分公司,以及显示和履行职责的功能。
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); } public override void Display(int depth) //显示 { Console.WriteLine(new String('_',depth)+name); foreach (Company component in children ) { component.Display(depth+2); } } public override void LineOfDuty() { foreach (Company component in children) { component.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("南京办事处财务部")); root.Add(comp1);//总部添加办事处的结构 ConcreteCompany comp2 = new ConcreteCompany("杭州办事处"); comp2.Add(new HRDepartment("杭州办事处人力资源部")); comp2.Add(new FinanceDepartment("杭州办事处财务部")); root.Add(comp2);//总部添加办事处的结构 Console.WriteLine("\n结构图:"); root.Display(1); Console.WriteLine("\n职责:"); root.LineOfDuty(); Console.Read(); }
显示结果: