結構型模式-組合模式
阿新 • • 發佈:2018-12-13
組合模式可以處理整體和部分的關係,如果整體和部分擁有相同的結構,最典型的如二叉樹,檔案系統
下面來看例子,公司,分公司,部門
package constructional.pattern.composite; /** * 檔名稱:design.composite.Company.java * 建立人:Fei Wong * 建立時間: 2012-06-26 * 電子郵箱:[email protected] * */ public abstract class Company { private String name; public Company(String name) {this.name = name; } public Company() { } public String getName() { return name; } public void setName(String name) { this.name = name; } protected abstract void add(Company company); protected abstract void romove(Company company); protectedabstract void display(int depth); }
package constructional.pattern.composite; import java.util.ArrayList; import java.util.List; /** * 檔名稱:design.singleton.CommandInvoker.java * 建立人:Fei Wong * 建立時間: 2012-06-26 * 電子郵箱:[email protected] * */ public class ConcreteCompany extends Company {private List<Company> cList; public ConcreteCompany() { cList = new ArrayList<Company>(); } public ConcreteCompany(String name) { super(name); cList = new ArrayList<Company>() ; } @Override protected void add(Company company) { cList.add(company); } @Override protected void display(int depth) { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("-"); } System.out.println(new String(sb) + this.getName()); for (Company c : cList) { c.display(depth + 2); } } @Override protected void romove(Company company) { cList.remove(company); } }
package constructional.pattern.composite; /** * 檔名稱:design.composite.FinanceDepartment.java * 建立人:Fei Wong * 建立時間: 2012-06-26 * 電子郵箱:[email protected] */ public class FinanceDepartment extends Company { public FinanceDepartment(){ } public FinanceDepartment(String name){ super(name); } @Override protected void add(Company company) { } @Override protected void display(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("-"); } System.out.println(new String(sb) + this.getName() ) ; } @Override protected void romove(Company company) { } }
package constructional.pattern.composite; /** * 檔名稱:design.composite.HRDepartment.java * 建立人:Fei Wong * 建立時間: 2012-06-26 * 電子郵箱:[email protected] */ public class HRDepartment extends Company { public HRDepartment(){ } public HRDepartment(String name){ super(name); } @Override protected void add(Company company) { } @Override protected void display(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("-"); } System.out.println(new String(sb) + this.getName() ) ; } @Override protected void romove(Company company) { } }
下面是測試程式碼
package constructional.pattern.composite; public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Company root = new ConcreteCompany(); root.setName("北京總公司"); root.add(new HRDepartment("總公司人力資源部")); root.add(new FinanceDepartment("總公司財務部")); Company shandongCom = new ConcreteCompany("山東分公司"); shandongCom.add(new HRDepartment("山東分公司人力資源部")); shandongCom.add(new FinanceDepartment("山東分公司賬務部")); Company zaozhuangCom = new ConcreteCompany("棗莊辦事處"); zaozhuangCom.add(new FinanceDepartment("棗莊辦事處財務部")); zaozhuangCom.add(new HRDepartment("棗莊辦事處人力資源部")); Company jinanCom = new ConcreteCompany("濟南辦事處"); jinanCom.add(new FinanceDepartment("濟南辦事處財務部")); jinanCom.add(new HRDepartment("濟南辦事處人力資源部")); shandongCom.add(jinanCom); shandongCom.add(zaozhuangCom); Company huadongCom = new ConcreteCompany("上海華東分公司"); huadongCom.add(new HRDepartment("上海華東分公司人力資源部")); huadongCom.add(new FinanceDepartment("上海華東分公司賬務部")); Company hangzhouCom = new ConcreteCompany("杭州辦事處"); hangzhouCom.add(new FinanceDepartment("杭州辦事處財務部")); hangzhouCom.add(new HRDepartment("杭州辦事處人力資源部")); Company nanjingCom = new ConcreteCompany("南京辦事處"); nanjingCom.add(new FinanceDepartment("南京辦事處財務部")); nanjingCom.add(new HRDepartment("南京辦事處人力資源部")); huadongCom.add(hangzhouCom); huadongCom.add(nanjingCom); root.add(shandongCom); root.add(huadongCom); root.display(0); } }
執行結果如下: