JAVA设计模式:组合模式

Posted jzdwajue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA设计模式:组合模式相关的知识,希望对你有一定的参考价值。

组合(总体与部分关系)模式:将不同可是相关的对象组合成树形结构以实现“部分-总体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
* 模式角色组成:
* 1.Component对象: 是组合中的对象接口,是全部类共同拥有的接口。是用于统一定义总体中的部分。
2.Leaf对象: 总体中的部分,没有下一级。
3.Composite对象: 用来存储子部件。在Component接口中实现与部分有关操作。


以公司构成为例,比方公司有总公司。总公司下有分公司,分公司下有办事处等。构成一个树形结构。

/**
 * 抽象类:用来管理子类
 * @description:
 * @date 2016-1-22 下午1:16:25
 */
public abstract class Firm {
    private String firmName;// 公司名称
    public Firm(String firmName) {
        this.firmName = firmName;
    }

    public String getFirmName() {
        return firmName;
    }

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

    protected abstract void append(Firm firm);// 加入公司如:新增分公司

    protected abstract void romove(Firm firm);// 删除公司:如因故关闭分公司

    protected abstract void show(int level);//显示公司所在的层级:总公司,分公司,办事处等
}
/**
 * 分公司对象
 * @description:
 * @date 2016-1-22 下午1:25:43
 */
public class BranchFirm extends Firm {
    private List<Firm> cList;

    public BranchFirm(String name) {
        super(name);
        cList = new ArrayList<Firm>();
    }

    @Override
    protected void append(Firm firm) {
        cList.add(firm);
    }

    @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.getFirmName());
        for (Firm c : cList) {
            c.show(depth + 2);
        }
    }

    @Override
    protected void romove(Firm firm) {
        // TODO Auto-generated method stub
        cList.remove(firm);
    }
}
/**
 * Leaf结点类:公司市场部
 * @description:
 * @date 2016-1-22 下午1:46:02
 */
public class MarketDepartment extends Firm {
    public MarketDepartment(String name) {
        super(name);
    }

    @Override
    protected void append(Firm company) {
    }

    @Override
    protected void show(int depth) {
        // TODO Auto-generated method stub
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("*");
        }
        System.out.println(new String(sb) + this.getFirmName());
    }

    @Override
    protected void romove(Firm company) {
    }
}
/**
 * Leaf结点类:公司技术部
 * @description:
 * @date 2016-1-22 下午1:21:41
 */
public class MinTechDepartment extends Firm {
    public MinTechDepartment(String name) {
        super(name);
    }

    @Override
    protected void append(Firm firm) {
    }

    @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.getFirmName());
    }

    @Override
    protected void romove(Firm company) {
    }
}
public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Firm head = new BranchFirm("深圳XX集团有限公司");// 公司总部
        head.append(new MarketDepartment("深圳XX集团有限公司--市场部"));
        head.append(new MinTechDepartment("深圳XX集团有限公司--技术部"));
        Firm jsFirm = new BranchFirm("深圳XX集团有限公司-江苏分公司");
        jsFirm.append(new MarketDepartment("深圳XX集团有限公司-江苏分公司市场部"));
        jsFirm.append(new MinTechDepartment("深圳XX集团有限公司-江苏分公司技术部"));
        Firm szFirm = new BranchFirm("深圳XX集团有限公司-江苏分公司-苏州办事处");
        szFirm.append(new MinTechDepartment("深圳XX集团有限公司-江苏分公司-苏州办事处技术部"));
        szFirm.append(new MarketDepartment("深圳XX集团有限公司-江苏分公司-苏州办事处市场部"));
        jsFirm.append(szFirm);
        // 假设还须要新增分公司或办事处等。就依照第19-25行操作
        head.append(jsFirm);
        head.show(0);
    }
}
通常:在须要表示对象的总体与部分层次结构或须要忽略组合的总体对象与部分对象的不同,统一地使用总体中的部门情况下来使用组合模式。





以上是关于JAVA设计模式:组合模式的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式 GOF23 09 组合模式

Java 设计模式——组合模式

大话设计模式-组合模式(大鸟和小菜Java版)

JAVA SCRIPT设计模式--结构型--设计模式之Composite组合模式

java 查看寻呼机设计模式与片段。

基于JAVA的设计模式之组合模式