組合模式定義(Composite):將對象組合成樹形結構以表示「部分-總體」的層次結構。ide
組合模式使得用戶對單個對象和組合對象的使用具備一致性;this
1-一、簡單UML圖:spa
1-二、代碼實現:code
//一、抽象父類(公司父類) 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 extends Company { private List<Company> childrenList = new ArrayList<Company>(); public ConcreteCompany(String companyname) { super(companyname); } @Override public void Add(Company c) { childrenList.add(c); } @Override public void Remove(Company c) { childrenList.remove(c); } @Override public void Display(int depth) { for(int i=0;i<depth;i++) { System.out.print('-'); } System.out.print(Name + '\n'); for (int i = 0;i<childrenList.size();i++) { childrenList.get(i).Display(depth + 2); } } @Override public void LineofDuty() { for (int i = 0;i<childrenList.size();i++) { childrenList.get(i).LineofDuty(); } } } //3-一、葉子節點(具體公司部門類--人力資源部) class HRDepartment extends Company { public HRDepartment(String companyname) { super(companyname); } @Override public void Add(Company c) { } @Override public void Remove(Company c) { } @Override public void Display(int depth) { for(int i=0;i<depth;i++) { System.out.print('-'); } System.out.print(Name + '\n'); } @Override public void LineofDuty() { System.out.println(Name + ": 招聘員工"); } } //3-二、葉子節點(具體公司部門類--財務部) class FinanceDepartment extends Company { public FinanceDepartment(String companyname) { super(companyname); } @Override public void Add(Company c) { } @Override public void Remove(Company c) { } @Override public void Display(int depth) { for(int i=0;i<depth;i++) { System.out.print('-'); } System.out.print(Name + '\n'); } @Override public void LineofDuty() { System.out.println(Name + ": 發放工資"); }
客戶端:對象
ConcreteCompany root = new ConcreteCompany("深圳總公司"); root.Add(new HRDepartment("深圳總公司人力資源部")); root.Add(new FinanceDepartment("深圳總公司財務部")); ConcreteCompany cp1 = new ConcreteCompany("昆明分公司"); cp1.Add(new HRDepartment("昆明分公司人力資源部")); cp1.Add(new FinanceDepartment("昆明分公司財務部")); root.Add(cp1); ConcreteCompany cp2 = new ConcreteCompany("雲大辦事處"); cp2.Add(new HRDepartment("雲大辦事處人力資源部")); cp2.Add(new FinanceDepartment("雲大辦事處財務部")); cp1.Add(cp2); ConcreteCompany cp3 = new ConcreteCompany("昆工辦事處"); cp3.Add(new HRDepartment("昆工辦事處人力資源部")); cp3.Add(new FinanceDepartment("昆工辦事處財務部")); cp1.Add(cp3); System.out.println("結構圖:"); root.Display(1); System.out.println("職責:"); root.LineofDuty();
運行結果:blog
一、當體現部分與總體層次的結構時;資源
二、但願用戶能夠忽略組合對象與單個對象的不一樣,統一地使用組合結構中全部對象時;rem