乐趣区

关于设计模式:设计模式之组合模式企业部门的结构

前言

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

一. 什么是组合模式

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

二. 生存中的组合模式

1. 文件夹

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

2. 企业治理

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

3. 军队治理

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

三. 组合模式的实现

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

首先咱们先创立一个形象构件 (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<Component> 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<Component> 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…

退出移动版