組合模式(Composite)
阿新 • • 發佈:2017-06-17
rem for remove 安全 tco fin trac roo 問題
組合模式:將對象組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
public abstract class Company { protected string name; public Company(string name) { this.name = name; } public abstract void Add(Company company); public abstract void Remove(Company company);public abstract void Display(int depth); public abstract void LineOfDuty(); }
public class ConcreteCompany:Company { private IList<Company> companys = new List<Company>(); public ConcreteCompany(string name) :base(name) { }public override void Add(Company company) { companys.Add(company); } public override void Remove(Company company) { companys.Remove(company); } public override void Display(int depth) { Console.WriteLine(newstring(‘-‘,depth) + name); foreach(var company in companys) { company.Display(depth + 2); } } public override void LineOfDuty() { foreach(var company in companys) { company.LineOfDuty(); } } }
public class HRDepartment:Company { public HRDepartment(string name) :base(name) { } public override void Add(Company company) { } public override void Remove(Company company) { } public override void Display(int depth) { Console.WriteLine(new string(‘-‘, depth) + name); } public override void LineOfDuty() { Console.WriteLine("{0} 員工招聘培訓管理",name); } }
public class FinanceDepartment:Company { public FinanceDepartment(string name) : base(name) { } public override void Add(Company company) { } public override void Remove(Company company) { } public override void Display(int depth) { Console.WriteLine(new string(‘-‘, depth) + name); } public override void LineOfDuty() { Console.WriteLine("{0} 公司財務收支管理",name); } }
class Program { static void Main(string[] args) { Company rootCompany = new ConcreteCompany("北京總公司"); rootCompany.Add(new HRDepartment("總公司人力資源部")); rootCompany.Add(new FinanceDepartment("總公司財務部")); Company eastCompany = new ConcreteCompany("華東分公司"); eastCompany.Add(new HRDepartment("華東分公司人力資源部")); eastCompany.Add(new FinanceDepartment("華東分公司財務部")); rootCompany.Add(eastCompany); Company shanghaiCompany = new ConcreteCompany("上海辦事處"); shanghaiCompany.Add(new HRDepartment("上海辦事處人力資源部")); shanghaiCompany.Add(new FinanceDepartment("上海辦事處財務部")); eastCompany.Add(shanghaiCompany); Console.WriteLine("機構圖:"); rootCompany.Display(1); Console.WriteLine("職責:"); rootCompany.LineOfDuty(); } }
關於Leaf中也有add和remove。
這種方式叫做透明方式,也就是說在Component中聲明所有用來管理子對象的方法,其中包括add,remove等。這樣實現Component接口的所有子類都具備了add和remove。這樣的好處是葉節點和枝節點
對於外界沒有區別,完全一致的接口。問題是,leaf本身並不具備add和remove方法的功能,所以實現它是沒有意義的。
安全方式,也就是在Componet接口中不去聲明add和remove方法。那麽子類的leaf也就不需要去實現它,而在Composite聲明所有用來管理子類對象的方法。但是不夠透明。樹葉和樹枝將不具有相同的 接口
,客戶端的調用要做相應的判斷,帶來了不便。
什麽地方用:
當需求中是體現部分與整體層次的結構時,以及希望用戶忽略組合對象和單個對象的不同,統一的使用組合結構中的所有對象時,就考慮使用組合模式。
組合模式(Composite)