组合模式:让客户可以一致的使用组合结构和单个对象 #region 组合模式 abstract class Company { private string name; public string Name { get { return name; } set { name = value; } } public Company(string name) { this.name = name; } public abstract void Add(Company comp); public abstract void Remove(Company comp); public abstract void Display(int depth); public abstract void LineOfDuty(); } class ConcreteCompany : Company { public ConcreteCompany(string name) : base(name) { } private List<Company> children = new List<Company>(); public override void Add(Company comp) { children.Add(comp); } public override void Remove(Company comp) { children.Remove(comp); } public override void Display(int depth) { Console.WriteLine(new string('*', depth) + base.Name); foreach (Company c in children) { c.Display(depth + 2); } } public override void LineOfDuty() { foreach (Company c in children) { c.LineOfDuty(); } } } class HRDepartment : Company { public HRDepartment(string name) : base(name) { } public override void Add(Company comp) { Console.WriteLine("这是最底层组织了,无法添加"); } public override void Remove(Company comp) { Console.WriteLine("这是最底层组织了,无法移除"); } public override void Display(int depth) { Console.WriteLine(new string('*', depth) + this.Name); } public override void LineOfDuty() { Console.WriteLine("{0} 公司员工管理", this.Name); } } class FinanceDepartment : Company { public FinanceDepartment(string name) : base(name) { } public override void Add(Company comp) { Console.WriteLine("这是最底层组织了,无法添加"); } public override void Remove(Company comp) { Console.WriteLine("这是最底层组织了,无法移除"); } public override void Display(int depth) { Console.WriteLine(new string('*', depth) + this.Name); } public override void LineOfDuty() { Console.WriteLine("{0} 公司财务资金管理", this.Name); } } #endregion class Program { static void Main(string[] args) { #region 组合模式 Console.WriteLine("组合模式效果演示:"); ConcreteCompany comRoot = new ConcreteCompany("北京总部"); HRDepartment hrDepBeijing = new HRDepartment("总部人力资源部"); FinanceDepartment fDepBeijing = new FinanceDepartment("总部财务部"); comRoot.Add(hrDepBeijing); comRoot.Add(fDepBeijing); ConcreteCompany comSouth = new ConcreteCompany("华南分公司"); HRDepartment hrDepSouth = new HRDepartment("华南人力资源部"); FinanceDepartment fDepSouth = new FinanceDepartment("华南财务部"); comSouth.Add(hrDepSouth); comSouth.Add(fDepSouth); comRoot.Add(comSouth); ConcreteCompany comShenzhen = new ConcreteCompany("深圳办事处"); HRDepartment hrDepShenzhen = new HRDepartment("深圳人力资源部"); FinanceDepartment fDepShenzhen = new FinanceDepartment("深圳财务部"); comShenzhen.Add(hrDepShenzhen); comShenzhen.Add(fDepShenzhen); comSouth.Add(comShenzhen); ConcreteCompany comHangzhou = new ConcreteCompany("杭州分公司"); HRDepartment hrDepHangzhou = new HRDepartment("杭州人力资源部"); FinanceDepartment fDepHangzhou = new FinanceDepartment("杭州财务部"); comHangzhou.Add(hrDepHangzhou); comHangzhou.Add(fDepHangzhou); comRoot.Add(comHangzhou); comRoot.Display(2); comRoot.LineOfDuty(); #endregion } }