1. 程式人生 > >結構型模式-組合模式

結構型模式-組合模式

  組合模式可以處理整體和部分的關係,如果整體和部分擁有相同的結構,最典型的如二叉樹,檔案系統

  下面來看例子,公司,分公司,部門

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); protected
abstract 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);
    }
}

  執行結果如下: