Java設計設計模式之組合模式(Composition)

那王麻子自從做了肉夾饃生意後,真是風生水起,分店開的跟下餃子似的,沒多久這分店經營就開遍全國了,一時半會兒連自己都數不過來開了哪些分店了,爲了方便管理他在各個地區都設立了分公司。於是這期我們分享設計模式裏的組合模式。

 

組合模式在處理複雜的樹形結構操作中有他的獨到的地方,對於樹形結構層次簡單,葉子有限的數據結構處理過程中,如果使用組合模式就有些賣藝之嫌。他的優點是簡單有效、運算方式清晰明瞭。缺點是由於領域模型與業務處理緊緊耦合到一塊,是典型的充血模型,代碼的可維護性、可讀性不強。因此,一般設計過程中,對組合模式的選擇都是慎之又慎,謹慎採納。

 

但是也不盡然,比如一些大部分的非業務型處理邏輯如磁盤掃描之類的功能,如果用其他的方式來實現,代碼量會大幅增加,用組合模式會讓人感覺代碼簡潔,結構清晰。

 

用類圖來說明組合模式如下:

 

示例代碼如下:

 

/**
 * 
 */
package composite;

/**
 * 
 * @author Administrator
 * @version $Id: Department.java, v 0.1 2017年3月11日 下午4:38:56 Administrator Exp $
 */
public abstract class Department {

    /**  */
    private String name;

    /**
     * default constructor
     */
    public Department(String name) {
        this.name = name;
    }

    /**
     * default constructor 
     */
    public Department() {
    }

    /**
     * 添加
     */
    protected abstract void add(Department department);

    /**
     * 打印
     */
    protected abstract void show(int depth);

    /**
     * Getter method for property <tt>name</tt>.
     * 
     * @return property value of name
     */
    public String getName() {
        return name;
    }

    /**
     * Setter method for property <tt>name</tt>.
     * 
     * @param name value to be assigned to property name
     */
    public void setName(String name) {
        this.name = name;
    }

}

 

 

 

/**
 * Copyright (c) 2004-2017 All Rights Reserved.
 */
package composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author Administrator
 * @version $Id: DinnerDepartment.java, v 0.1 2017年3月11日 下午4:45:50 Administrator Exp $
 */
public class DinnerDepartment extends Department {

    /**  */
    private List<Department> deptList = new ArrayList<Department>();

    public DinnerDepartment() {
    }

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

    /** 
     * @see composite.Department#add(composite.Department)
     */
    @Override
    protected void add(Department department) {

        deptList.add(department);

    }

    /** 
     * @see composite.Department#show(int)
     */
    @Override
    protected void show(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        System.out.println(new String(sb) + this.getName());
        for (Department c : deptList) {
            c.show(depth + 2);
        }
    }

}

 

 

/**
 * Copyright (c) 2004-2017 All Rights Reserved.
 */
package composite;

/**
 * 
 * @author Administrator
 * @version $Id: HRDepartment.java, v 0.1 2017年3月11日 下午5:01:10 Administrator Exp $
 */
public class HRDepartment extends Department {
    public HRDepartment() {
    }

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

    /** 
     * @see composite.Department#add(composite.Department)
     */
    @Override
    protected void add(Department department) {
    }

    /** 
     * @see composite.Department#show(int)
     */
    @Override
    protected void show(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("--");
        }
        System.out.println(new String(sb) + this.getName());
    }

}

 

 

 

/**
 * Copyright (c) 2004-2017 All Rights Reserved.
 */
package composite;

/**
 * 
 * @author Administrator
 * @version $Id: FinanceDepartment.java, v 0.1 2017年3月11日 下午5:02:42 Administrator Exp $
 */
public class FinanceDepartment extends Department {
    public FinanceDepartment() {
    }

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

    /** 
     * @see composite.Department#add(composite.Department)
     */
    @Override
    protected void add(Department department) {
    }

    /** 
     * @see composite.Department#show(int)
     */
    @Override
    protected void show(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("--");
        }
        System.out.println(new String(sb) + this.getName());
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub  
        Department root = new DinnerDepartment();
        root.setName("北京總公司");
        root.add(new HRDepartment("總公司人力資源部"));
        root.add(new FinanceDepartment("總公司財務部"));

        Department shandongCom = new DinnerDepartment("山東分公司");
        shandongCom.add(new HRDepartment("山東分公司人力資源部"));
        shandongCom.add(new FinanceDepartment("山東分公司賬務部"));

        Department zaozhuangCom = new DinnerDepartment("棗莊辦事處");
        zaozhuangCom.add(new FinanceDepartment("棗莊辦事處財務部"));
        zaozhuangCom.add(new HRDepartment("棗莊辦事處人力資源部"));

        Department jinanCom = new DinnerDepartment("濟南辦事處");
        jinanCom.add(new FinanceDepartment("濟南辦事處財務部"));
        jinanCom.add(new HRDepartment("濟南辦事處人力資源部"));

        shandongCom.add(jinanCom);
        shandongCom.add(zaozhuangCom);

        Department huadongCom = new DinnerDepartment("上海華東分公司");
        huadongCom.add(new HRDepartment("上海華東分公司人力資源部"));
        huadongCom.add(new FinanceDepartment("上海華東分公司賬務部"));

        Department hangzhouCom = new DinnerDepartment("杭州辦事處");
        hangzhouCom.add(new FinanceDepartment("杭州辦事處財務部"));
        hangzhouCom.add(new HRDepartment("杭州辦事處人力資源部"));

        Department nanjingCom = new DinnerDepartment("南京辦事處");
        nanjingCom.add(new FinanceDepartment("南京辦事處財務部"));
        nanjingCom.add(new HRDepartment("南京辦事處人力資源部"));

        huadongCom.add(hangzhouCom);
        huadongCom.add(nanjingCom);

        root.add(shandongCom);
        root.add(huadongCom);

        root.show(12);
    }

}

 

 運行結果如下:

------------北京總公司
----------------------------總公司人力資源部
----------------------------總公司財務部
--------------山東分公司
--------------------------------山東分公司人力資源部
--------------------------------山東分公司賬務部
----------------濟南辦事處
------------------------------------濟南辦事處財務部
------------------------------------濟南辦事處人力資源部
----------------棗莊辦事處
------------------------------------棗莊辦事處財務部
------------------------------------棗莊辦事處人力資源部
--------------上海華東分公司
--------------------------------上海華東分公司人力資源部
--------------------------------上海華東分公司賬務部
----------------杭州辦事處
------------------------------------杭州辦事處財務部
------------------------------------杭州辦事處人力資源部
----------------南京辦事處
------------------------------------南京辦事處財務部
------------------------------------南京辦事處人力資源部

 

 

各位看官,原創不易啊,轉載請註明出處: http://danlley.iteye.com 看在打字不易的份上,打賞一個吧

參考文獻:

http://baike.baidu.com/link?url=Ya5mjVEkWCIknSlkYJX-FvXlPDNJmsB16m4-d1eXhOM5kMn0phNQ8xY_326Y5BgrDWj5MYW5lxnCvL_xZ-5kAP6P_ArKyMKKvVPNWorNvGmVpAxoXib9lpWyJlCqKhO7
http://blog.csdn.net/hfmbook/article/details/7693069
  • 876ccd6d-9314-3f56-8b6a-f051fec903d7-thumb.jpg
  • 大小: 17.4 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章