天天看點

《大話設計模式》java實作之組合模式

組合模式主要是展現部分與整體層次的結構,統一使用結構中的所有對象(書中原話)。

個人了解:組合模式多用于樹狀展現的内容中。

本示例省略書中的履行職責方法,這個對該模式沒什麼影響

UML圖

《大話設計模式》java實作之組合模式

代碼結構

《大話設計模式》java實作之組合模式
public class Client {
    public 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);

        System.out.println("結構圖");
        root.display();
    }
}
           
public abstract class Company {
    private String name;     //書中是procteced,為了和以往程式設計習慣一緻,這裡使用private

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Company() {                  //保留無參構造方法
        super();
    }

    public Company(String name) {
        super();
        this.name = name;
    }

    public abstract void add(Company company);
    public abstract void remove(Company company);
    public abstract void display(int depth);
}
           
public class ConcreteCompany extends Company {

    private List<Company> children = new ArrayList<>();

    public ConcreteCompany(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {
        children.add(company);
    }

    @Override
    public void remove(Company company) {
        children.remove(company);
    }

    @Override
    public void display(int depth) {
        for(int i = ; i < depth; i++) {   //由于沒有找到書中的類似方法,這裡作了一個小循環
            System.out.print("-");
        }
        System.out.println(getName());

        for(Company component : children) {
            component.display(depth + );
        }
    }

}
           
public class FinanceDepartment extends Company {

    public FinanceDepartment(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {

    }

    @Override
    public void remove(Company company) {

    }

    @Override
    public void display(int depth) {
        for(int i = ; i < depth; i++) {   //由于沒有找到書中的類似方法,這裡作了一個小循環
            System.out.print("-");
        }
        System.out.println(getName());
    }

}
           
public class HRDepartment extends Company {

    public HRDepartment(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {

    }

    @Override
    public void remove(Company company) {

    }

    @Override
    public void display(int depth) {
        for(int i = ; i < depth; i++) {   //由于沒有找到書中的類似方法,這裡作了一個小循環
            System.out.print("-");
        }
        System.out.println(getName());
    }

}
           

結果

《大話設計模式》java實作之組合模式

多說一句,從上面可以看到HRDepartment和FinanceDepartment的display方法都是重複的代碼,這個可以用模版方法模式進行優化,在父類定義一個方法template,然後子類調用,ConcreCompany調用父類後再添加自己的邏輯即可。

繼續閱讀