天天看點

組合模式

《大話設計模式》閱讀筆記和總結。原書是C#編寫的,本人用Java實作了一遍,包括每種設計模式的UML圖實作和示例代碼實作。

目錄:

設計模式 Github位址: DesignPattern

說明

定義:組合模式(Composite),将對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得使用者對單個對象群組合對象的使用具有一緻性。

UML圖:

組合模式

組合模式UML圖.png

代碼實作:

Component為組合中的對象聲明接口,在适當情況下,實作所有類共有接口的預設行為。聲明一個接口用于通路和管理Component子部件

abstract class Component{
    protected String name;

    public Component(String name) {
        this.name = name;
    }
    
    public abstract void Add(Component c);
    public abstract void Remove(Component c);
    public abstract void Display(int depth);
    
}


           

Leaf在組合中表示葉節點對象,葉節點沒有子節點

class Leaf extends Component{

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

    @Override
    public void Add(Component c) {
        System.out.println("Cannot add to a leaf");
    }

    @Override
    public void Remove(Component c) {
        System.out.println("Cannot remove to a leaf");
    }

    /**
     * 頁節點的具體方法,此處是顯示其名稱和級别
     * @param depth
     */
    @Override
    public void Display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);
    }
}

           

Composite定義枝節點行為,用于存儲子部件,在Component接口中實作與子部件有關的操作,比如增加Add和remove删除

class Composite extends Component{
    
    private List<Component> children = new ArrayList<>();

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

    @Override
    public void Add(Component c) {
        children.add(c);
    }

    @Override
    public void Remove(Component c) {
        children.remove(c);
    }

    @Override
    public void Display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);
        for (Component component : children) {
            component.Display(depth+2);
        }
    }
    
}
           

用戶端代碼

public class CompositePattern {
    public static void main(String[] args) {
        Composite root = new Composite("root");
        root.Add(new Leaf("Leaf A"));
        root.Add(new Leaf("Leaf B"));
        
        Composite comp = new Composite("Composite X");
        comp.Add(new Leaf("Leaf XA"));
        comp.Add(new Leaf("Leaf XB"));
        root.Add(comp);
        
        Composite comp2 = new Composite("Composite XY");
        comp2.Add(new Leaf("Leaf XYA"));
        comp2.Add(new Leaf("Leaf XYB"));
        comp.Add(comp2);
        
        root.Add(new Leaf("Leaf C"));
        
        Leaf leaf = new Leaf("Leaf D");
        root.Add(leaf);
        root.Remove(leaf);
        
        root.Display(1);
        
    }
}
           

運作結果

-root
---Leaf A
---Leaf B
---Composite X
-----Leaf XA
-----Leaf XB
-----Composite XY
-------Leaf XYA
-------Leaf XYB
---Leaf C
           

示例

例子:一個公司的組織結構圖如下圖所示,用程式來展示這個層級架構。

組合模式

組合模式示例圖.png

組合模式

組合模式示例UML圖.png

公司類,抽象類或接口

public 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();//履行職責
}

           

具體公司類,實作接口樹枝節點

public class ConcreteCompany extends Company{
    
    private List<Company> children = new ArrayList<Company>();

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

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

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

    @Override
    public void Display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);
        
        for (Company company : children) {
            company.Display(depth+2);
        }
        
    }

    @Override
    public void LineOfDuty() {
        for (Company company : children) {
            company.LineOfDuty();
        }
    }

}

           

HR部門

public class HRDepartment extends Company{

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

    @Override
    public void Add(Company c) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void Remove(Company c) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void Display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);
        
    }

    @Override
    public void LineOfDuty() {
        System.out.println(name+"員工招聘教育訓練管理");
        
    }

}

           

财務部

public class FinanceDepartment extends Company{

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

    @Override
    public void Add(Company c) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void Remove(Company c) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void Display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);
        
    }

    @Override
    public void LineOfDuty() {
        System.out.println(name+"公司财務收支管理");
        
    }

}

           
public class Main {
    public static void main(String[] args) {
        ConcreteCompany root = new ConcreteCompany("北京總公司");
        root.Add(new HRDepartment("總公司人力資源部"));
        root.Add(new HRDepartment("總公司财務部"));
    
        ConcreteCompany comp = new ConcreteCompany("上海華東分公司");
        comp.Add(new HRDepartment("上海華東分公司人力資源部"));
        comp.Add(new HRDepartment("上海華東分公司财務部"));
        root.Add(comp);
        
        ConcreteCompany comp1 = new ConcreteCompany("南京辦事處");
        comp1.Add(new HRDepartment("南京辦事處人力資源部"));
        comp1.Add(new HRDepartment("南京辦事處财務部"));
        comp.Add(comp1);
        
        ConcreteCompany comp2 = new ConcreteCompany("杭州辦事處");
        comp2.Add(new HRDepartment("杭州辦事處人力資源部"));
        comp2.Add(new HRDepartment("杭州辦事處财務部"));
        comp.Add(comp2);
        
        System.out.println("結構圖");
        root.Display(1);
        
        System.out.println("職責");
        root.LineOfDuty();
    }
}

           
結構圖
-北京總公司
---總公司人力資源部
---總公司财務部
---上海華東分公司
-----上海華東分公司人力資源部
-----上海華東分公司财務部
-----南京辦事處
-------南京辦事處人力資源部
-------南京辦事處财務部
-----杭州辦事處
-------杭州辦事處人力資源部
-------杭州辦事處财務部
職責
總公司人力資源部員工招聘教育訓練管理
總公司财務部員工招聘教育訓練管理
上海華東分公司人力資源部員工招聘教育訓練管理
上海華東分公司财務部員工招聘教育訓練管理
南京辦事處人力資源部員工招聘教育訓練管理
南京辦事處财務部員工招聘教育訓練管理
杭州辦事處人力資源部員工招聘教育訓練管理
杭州辦事處财務部員工招聘教育訓練管理
           
上一篇: 原型模式
下一篇: 建造者模式

繼續閱讀