美文网首页
组合模式

组合模式

作者: 码上述Andy | 来源:发表于2019-07-26 22:53 被阅读0次

1.概述

组合模式是描述部分和整体的关系,可以形象的表示一个树形结构。

2.UML结构图

image.png

3.代码实现:

Component抽象接口

**
 * Created by zhouwen on 2019/7/27
 */
public abstract class Component {
    protected String mName;

    public Component(String name) {
        mName = name;
    }

    public abstract void show();

    public void add(Component component) {

    }

    public void remove(Component component) {

    }
}

Composite树枝节点

/**
 * Created by zhouwen on 2019/7/27 14:19
 */
//树枝节点
public class Composite extends Component {

    private List<Component> components = new ArrayList<>();

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

    @Override
    public void show() {
        Logger.getLogger("Composite").info("show#name=" + mName);
        for (Component component :
                components) {
            component.show();
        }
    }

    @Override
    public void add(Component component) {
        if (components.contains(component))
            components.add(component);
    }

    @Override
    public void remove(Component component) {
        if (components.contains(component))
            components.remove(component);
    }
}

Leaf树叶节点

/**
 * Created by zhouwen on 2019/7/27
 *
 */
//树叶节点
public class Leaf extends Component{

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

    @Override
    public void show() {
        Logger.getLogger("Leaf").info("show#name=" + mName);
    }
}

Client实现类

/**
 * Created by zhouwen on 2019/7/27
 */
public class Client {
    public void test() {
        Component root = new Composite("root");

        Component branch = new Composite("branch");
        Component branch2 = new Composite("branch2");
        Component branch3 = new Composite("branch3");
        root.add(branch);
        root.add(branch2);
        branch2.add(branch3);

        Component leaf = new Leaf("leaf");
        branch.add(leaf);

        Component leaf2 = new Leaf("leaf2");
        Component leaf3 = new Leaf("leaf3");
        branch2.add(leaf2);
        branch2.add(leaf3);

        root.show();
    }
}

下面以我们公司层级为例:

image.png
/**
 * Created by zhouwen on 2019/7/27 14:58
 */
public abstract class Company {
    protected String mName;

    public Company(String name) {
        mName = name;
    }

    public abstract void showHierarchy();

    public void add(Company component) {

    }

    public void remove(Company component) {

    }
}
/**
 * Created by zhouwen on 2019/7/27 15:18
 */
public class BJ总公司 extends Company{
    private List<Company> companies = new ArrayList<>();
    @Override
    public void showHierarchy() {
        Logger.getLogger("BJ总公司").info("BJ总公司#name=" + mName);
        for (Company company:
                companies) {
            company.showHierarchy();
        }

    }

    public BJ总公司(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {
        if (companies.contains(company)){
            companies.add(company);
        }
    }

    @Override
    public void remove(Company company) {
        if (companies.contains(company))
            companies.remove(company);
    }

}
/**
 * Created by zhouwen on 2019/7/27 15:02
 */
public class BjSubCompany extends Company {

    private List<Company> companies = new ArrayList<>();
    @Override
    public void showHierarchy() {
        Logger.getLogger("BjSubCompany").info("BjSubCompany#name=" + mName);
        for (Company company:
                companies) {
            company.showHierarchy();
        }

    }

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

    @Override
    public void add(Company company) {
        if (companies.contains(company)){
            companies.add(company);
        }
    }

    @Override
    public void remove(Company company) {
        if (companies.contains(company))
            companies.remove(company);
    }
}
/**
 * Created by zhouwen on 2019/7/27 15:03
 */
public class ForeignBranchOffice extends Company{

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

    @Override
    public void showHierarchy() {

    }
}
/**
 * Created by zhouwen on 2019/7/27 15:02
 */
public class GzSubCompany extends Company {
    private List<Company> companies = new ArrayList<>();

    @Override
    public void showHierarchy() {
        Logger.getLogger("GzSubCompany").info("GzSubCompany#name=" + mName);
        for (Company company :
                companies) {
            company.showHierarchy();
        }

    }

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

    @Override
    public void add(Company company) {
        if (companies.contains(company)) {
            companies.add(company);
        }
    }

    @Override
    public void remove(Company company) {
        if (companies.contains(company))
            companies.remove(company);
    }
}
/**
 * Created by zhouwen on 2019/7/27 15:04
 */
public class HR人力 extends Company{
    public HR人力(String name) {
        super(name);
    }

    @Override
    public void showHierarchy() {
        Logger.getLogger("HR人力").info("HR人力#name=" + mName);
    }
}
/**
 * Created by zhouwen on 2019/7/27 15:05
 */
public class RD研发 extends Company{

    public RD研发(String name) {
        super(name);
    }

    @Override
    public void showHierarchy() {
        Logger.getLogger("RD研发").info("RD研发#name=" + mName);
    }
}
/**
 * Created by zhouwen on 2019/7/27 15:05
 */
public class Finance财务 extends Company{
    public Finance财务(String name) {
        super(name);
    }

    @Override
    public void showHierarchy() {
        Logger.getLogger("Finance财务").info("Finance财务#name=" + mName);
    }
}
/**
 * Created by zhouwen on 2019/7/27 15:05
 */
public class Admin行政 extends Company{
    @Override
    public void showHierarchy() {
        Logger.getLogger("Admin行政").info("Admin行政#name=" + mName);
    }

    public Admin行政(String name) {
        super(name);
    }
}
/**
 * Created by zhouwen on 2019/7/27 15:16
 */
public class Client {
    public void test(){

        Company root = new BJ总公司("BJ总公司");
        Company company = new BjSubCompany("北京分公司");
        Company company2 = new BjSubCompany("广州分公司");
        Company company3 = new BjSubCompany("ForeignBranchOffice");

        root.add(company);
        root.add(company2);
        root.add(company3);

        company.add(new Admin行政("北京行政"));
        company.add(new HR人力("北京HR人力"));
        company.add(new Finance财务("北京财务"));

        company2.add(new HR人力("广州HR人力"));
        company2.add(new RD研发("广州研发"));

        Logger.getLogger("Client").info("公司层级:");
        root.showHierarchy();
    }
}

相关文章

  • 设计模式:组合模式 职责链模式

    组合模式 职责链模式 组合模式 组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。 在组合模式的树形结...

  • 第4章 结构型模式-组合模式

    一、组合模式简介 二、组合模式的优缺点 三、组合模式的使用场景 、组合模式的实例

  • 组合模式(统一叶子与组合对象)

    目录 从生活场景出发,映射组合模式 组合模式的理论概念 组合模式的实现 组合模式在源码中的应用 组合 “优于” 继...

  • 组合模式

    1. 组合模式 1.1 组合模式的定义 组合模式(Composite): 又称部分-整体模式, 将对象组合成树形结...

  • 组合模式

    设计模式系列7--组合模式 《Objective-c 编程之道 iOS 设计模式解析》 - 组合模式 常见组合模式...

  • 设计模式 | 组合模式及典型应用

    本文的主要内容: 介绍组合模式 示例 组合模式总结 源码分析组合模式的典型应用java.awt中的组合模式Java...

  • 组合模式

    一、组合模式介绍 二、组合模式代码实例

  • 组合模式

    设计模式之组合模式 什么是组合模式? 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以...

  • 15、组合模式(Composite Pattern)

    1. 组合模式 1.1 简介   Composite模式,即组合模式,又叫部分整体模式。Composite模式将对...

  • 组合模式原型解析

    组合模式定义: 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象...

网友评论

      本文标题:组合模式

      本文链接:https://www.haomeiwen.com/subject/pjpylctx.html