設計模式之部分-整體模式
組合模式:
是將對象組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。組合是對象的集合,而其中的任何一個對象又可能是一個組合,或者是一個簡單的對象。在樹形結構中,訪問組合中所有的對象要求有一個簡單的單一訪問接口,但同時要求能夠區分開節點和葉子。在構造組合的時候,我們需要決定哪個節點是元素哪個是葉子。在這裏我們可以通過子節點個數進行判斷是不是葉子節點。
比如說一個公司,裏邊有經理,經理下邊有部門經理,部門經理下邊有小組負責人,小組負責人下邊有員工,這裏可以將這些人分為兩類,一類是雇員類(葉子節點),一類是老板類(有子節點)。這裏的葉子節點下麵是沒有分支的,而子節點則相當於樹枝,下麵有子節點,即屬於不同的層次的管理人員,這樣是明顯的組合-整體結構。通過舉例我們介紹一下組合模式結構圖。
組合模式結構圖:
例子:
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.Read(); } //公司類 抽象類或接口 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 LineOfDuty() { Console.WriteLine("{0}公司財務收支管理", name); } public override void Display(int depth) { Console.WriteLine(new string('-', depth) + name); } }
適用性:
當發現需求中是體現部分與整體層次結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮組合模式了
最後更新:2017-04-03 12:55:07