Java設計模式之--組合模式(Composite Pattern)

概念:


組合模式(Composite Pattern)

組合模式,將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。
有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程序可以像處理簡單元素一樣來處理複雜元素,從而使得客戶程序與複雜元素的內部結構解耦
組合模式經典案例:系統目錄結構,網站導航結構等。
其類結構圖如下:


案例,現規劃方案實現某科技公司業務部門結構
代碼:
部門類:
public abstract class Depat {
    private String name;
    private List<Depat> subDepat;
    private Depat parent;

    public abstract Depat addSubDepatment(Depat depasub);

    public abstract Depat removeSubDepatment(Depat depasub);

    public abstract Depat display();


    public Depat() {
    }

    public Depat(String depatname) {
        setName(depatname);
    }

    public Depat getParent() {
        return parent;
    }

    public void setParent(Depat parent) {
        this.parent = parent;
    }

    public List<Depat> getSubDepat() {
        return subDepat;
    }

    public void setSubDepat(List<Depat> subDepat) {
        this.subDepat = subDepat;
    }

    public String getName() {
        return name;
    }

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

}

public class Depatment extends Depat{
    public Depatment() {
        super();
        setSubDepat(new ArrayList<Depat>());
    }

    public Depatment(String depatmentname) {
        super(depatmentname);
        setSubDepat(new ArrayList<Depat>());
    }

    @Override
    public Depat addSubDepatment(Depat depasub) {
        depasub.setParent(this);
        getSubDepat().add(depasub);
        return this;
    }

    @Override
    public Depat removeSubDepatment(Depat depasub) {
        depasub.setParent(null);
        getSubDepat().remove(depasub);
        return this;
    }

    @Override
    public Depat display() {
        System.out.println(String.format("%s", this.getName()));
        for(Depat depat : getSubDepat()){
            depat.display();
        }
        return this;
    }
}
Company類
public class Company {
    Depatment root = null;

    public Depatment getRoot() {
        return root;
    }

    public void setRoot(Depatment root) {
        this.root = root;
    }


    public Company(String Name) {
        root = new Depatment(Name);
    }
}
測試類:
public class WorkClass {
    public void test() {
        Company company = new Company("某科技公司");
        company.getRoot().addSubDepatment(
                new Depatment("筆電大部").
                        addSubDepatment(new Depatment("筆電硬件研發部").
                                addSubDepatment(new Depatment("筆電硬件北京研發部")).
                                addSubDepatment(new Depatment("筆電硬件深圳研發部"))).
                        addSubDepatment(new Depatment("筆電軟件研發部").
                                addSubDepatment(new Depatment("筆電軟件杭州研發部")).
                                addSubDepatment(new Depatment("筆電軟件蘇州研發部"))))
                .addSubDepatment(
                new Depatment("手機大部").
                        addSubDepatment(new Depatment("手機硬件研發部").
                                addSubDepatment(new Depatment("手機硬件北京研發部")).
                                addSubDepatment(new Depatment("手機硬件深圳研發部"))).
                        addSubDepatment(new Depatment("手機軟件研發部").
                                addSubDepatment(new Depatment("手機軟件杭州研發部")).
                                addSubDepatment(new Depatment("手機軟件蘇州研發部"))));
        company.getRoot().display();
    }
}

輸出:
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 某科技公司
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電大部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電硬件研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電硬件北京研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電硬件深圳研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電軟件研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電軟件杭州研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 筆電軟件蘇州研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機大部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機硬件研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機硬件北京研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機硬件深圳研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機軟件研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機軟件杭州研發部
06-21 09:19:32.954 12750-12750/com.example.qinghua_liu.myapplication I/System.out: 手機軟件蘇州研發部

結語:
組合模式(Composite Pattern)它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念
   ,客戶程序可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程序與複雜元素的內部結構解耦。組合模式讓你可以優化處理遞
   歸或分級數據結構。有許多關於分級數據結構的例子,使得組合模式非常有用武之地。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章