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

猜你喜欢

转载自danlley.iteye.com/blog/2360394