设计模式之组合模式,企业部门的结构

前言

本文主要讲述组合模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。

一.什么是组合模式

组合模式是23种设计模式中结构型模式的一种,它创建了对象组的树形结构,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

二.生活中的组合模式

1.文件夹

在我们的电脑里面会存在很多资料,不管是学习资料、工作资料还是各种游戏。我们都不会选择一股脑地都放在一个盘下,而是会进行分门别类。比如江帅的电脑, D 盘里有个目录为 workspace 里面会存放各种代码, Program Files 会存放各种安装软件,game 里面会存放各种游戏,这样就能方便我们管理硬盘里内容,而这种分类方式就跟组合模式一样。

设计模式之组合模式,企业部门的结构_第1张图片

2.企业管理

在各个企业里都会有不同的部门以及不同级别的领导,比如级别最高是 CEO (首席执行官)和 CTO (首席技术官)等等,在之下有各部门的总监,副总监,之后是部长和各部门的主管,最后才是基层员工和实习生,而这种分类能够让企业管理起来更加地高效,这种管理方式就跟组合模式一样。

设计模式之组合模式,企业部门的结构_第2张图片

3.军队管理

目前在中国的军队中,军衔分为2等10级,如此划分不仅仅只是能力跟待遇的区别,也是为了更好的进行军队管理,而这种管理方式就跟组合模式一样。

设计模式之组合模式,企业部门的结构_第3张图片

三.组合模式的实现

接下来我们以所在的公司来举例,通过组合模式来实现。公司里有多个职能中心,每个职能中心中有一个或者多个部门。

首先咱们先创建一个抽象构件(Component)角色

package com.qianfeng.ran;

/*
 * @author:江帅
 *      抽象构建角色
 */
public abstract class Component {
    //名称
    private String name;
    //职责
    private String responsibility;

    public Component(String name, String responsibility) {
        this.name = name;
        this.responsibility = responsibility;
    }

    public String getName() {
        return name;
    }

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

    public String getResponsibility() {
        return responsibility;
    }

    public void setResponsibility(String responsibility) {
        this.responsibility = responsibility;
    }

    /**
     * 默认实现
     * @param component
     */
    protected void add(Component component) {
        throw new UnsupportedOperationException("该方法不支持");
    }
    protected void remove(Component component) {
        throw new UnsupportedOperationException("该方法不支持");
    }

    /**
     * 打印方法
     */
    protected abstract void print();
}

然后创建两个树枝构件角色公司类和组织类

package com.qianfeng.ran;

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

/*
 * @author:江帅
 *      树枝构件角色
 *          公司类
 */
public class Company extends Component {
    //存放组织的集合
    private List organizationList = new ArrayList<>();

    public Company(String name, String responsibility) {
        super(name, responsibility);
    }
    //添加组织进公司
    @Override
    protected void add(Component component) {
        organizationList.add(component);
    }
    //删除公司的组织
    @Override
    protected void remove(Component component) {
        organizationList.remove(component);
    }


    @Override
    protected void print() {
        //打印公司名和职责
        System.out.println("---------"+getName()+":"+getResponsibility()+"---------");
        //遍历公司里的组织
        organizationList.forEach(Component::print);
    }


}

/*
 * @author:江帅
 *      树枝构件角色
 *          组织类
 */
class Organization extends Component{
    //存放部门的集合
    private List departmentList = new ArrayList<>();

    public Organization(String name, String responsibility) {
        super(name, responsibility);
    }
    //添加部门进组织
    @Override
    protected void add(Component component) {
        departmentList.add(component);
    }
    //删除组织里的的部门
    @Override
    protected void remove(Component component) {
        departmentList.remove(component);
    }

    @Override
    protected void print() {
        //打印组织名和职责
        System.out.println("------"+getName()+":"+getResponsibility()+"------");
        //遍历组织的部门
        departmentList.forEach(Component::print);
    }
}

创建一个树叶构件角色部门类

package com.qianfeng.ran;

/*
 * @author:江帅
 *      树叶构件角色
 *          部门类
 */
public class Department extends Component {

    public Department(String name, String responsibility) {
        super(name, responsibility);
    }

    @Override
    protected void print() {
        //打印部门名和职责
        System.out.println(getName()+":"+getResponsibility());
    }
}

最后我们通过组合模式构建公司结构

package com.qianfeng.ran;

/*
 * @author:江帅
 *          客户端
 */
public class Demo {
    public static void main(String[] args) {
        //创建公司对象
        Component company = new Company("千锋教育","为中国培养专业IT人才");
        //创建组织对象
        Component educationOrganization = new Organization("IT特训营","教学质量保障");
        Component serviceOrganization = new Organization("服务保障部","教学服务保障");

        //创建部门对象并添加到指定的组织对象中
        educationOrganization.add(new Department("Java部门","培养未来Java大佬"));
        educationOrganization.add(new Department("HTML部门","培养未来前端大佬"));
        educationOrganization.add(new Department("云计算部门","培养未来云计算大佬"));
        serviceOrganization.add(new Department("品质保障部","辅导监督未来大佬学习"));
        serviceOrganization.add(new Department("企业合作部","与优秀企业合作并辅导未来大佬就业"));

        //添加组织到公司对象中
        company.add(educationOrganization);
        company.add(serviceOrganization);

        //打印公司结构与职责
        //执行结果:
        //---------千锋教育:为中国培养专业IT人才---------
        //------IT特训营:教学质量保障------
        //Java部门:培养未来Java大佬
        //HTML部门:培养未来前端大佬
        //云计算部门:培养未来云计算大佬
        //------服务保障部:教学服务保障------
        //品质保障部:辅导监督未来大佬学习
        //企业合作部:与优秀企业合作并辅导未来大佬就业
        company.print();
    }
}

四.总结

组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;就像管理一个部门,你身为部门总监,任务下发后,不管是基层员工完成还是部门领导完成都是一样的。

但是相对而言就需要客户端对类之间的层次关系较为清楚,意思就是管理企业,必须清楚公司里的整个架构每个组织每个部门以及对应的职能,才能够很好地去管理企业。

学习Java设计模式全套技术知识,欢迎关注以下免费课程!
https://www.bilibili.com/video/BV1GW4y1e7wC/?aid=943587741&ci...

你可能感兴趣的:(设计模式)