欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java设计设计模式之组合模式(Composition)

程序员文章站 2022-05-04 17:54:42
...

那王麻子自从做了肉夹馍生意后,真是风生水起,分店开的跟下饺子似的,没多久这分店经营就开遍全国了,一时半会儿连自己都数不过来开了哪些分店了,为了方便管理他在各个地区都设立了分公司。于是这期我们分享设计模式里的组合模式。

 

组合模式在处理复杂的树形结构操作中有他的独到的地方,对于树形结构层次简单,叶子有限的数据结构处理过程中,如果使用组合模式就有些卖艺之嫌。他的优点是简单有效、运算方式清晰明了。缺点是由于领域模型与业务处理紧紧耦合到一块,是典型的充血模型,代码的可维护性、可读性不强。因此,一般设计过程中,对组合模式的选择都是慎之又慎,谨慎采纳。

 

但是也不尽然,比如一些大部分的非业务型处理逻辑如磁盘扫描之类的功能,如果用其他的方式来实现,代码量会大幅增加,用组合模式会让人感觉代码简洁,结构清晰。

 

用类图来说明组合模式如下:

Java设计设计模式之组合模式(Composition)
            
    
    博客分类: J2EEJ2SE 设计模式JavaComposition组合模式 

 

示例代码如下:

 

/**
 * 
 */
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 看在打字不易的份上,打赏一个吧

Java设计设计模式之组合模式(Composition)
            
    
    博客分类: J2EEJ2SE 设计模式JavaComposition组合模式 

参考文献:

http://baike.baidu.com/link?url=Ya5mjVEkWCIknSlkYJX-FvXlPDNJmsB16m4-d1eXhOM5kMn0phNQ8xY_326Y5BgrDWj5MYW5lxnCvL_xZ-5kAP6P_ArKyMKKvVPNWorNvGmVpAxoXib9lpWyJlCqKhO7
http://blog.csdn.net/hfmbook/article/details/7693069
  • Java设计设计模式之组合模式(Composition)
            
    
    博客分类: J2EEJ2SE 设计模式JavaComposition组合模式 
  • 大小: 17.4 KB