硬肝系列:结构型模式的最后一章---组合模式

用示例代码来帮你了解组合模式

对于“设计模式”这个词大家肯定都不陌生,很多框架也用到了设计模式,但是大部分的开发者应该是没有深入的了解过,我准备硬肝下这23设计模式作为专题文章的开端,一共23种设计模式,我尽量在<23天肝完。

为什么要学习设计模式:https://blog.csdn.net/kaituozhe_sh/article/details/107922339

在我大学四年,对设计模式也没有什么概念,写代码就想着能实现就可以了,不会有设计模式那样的思想,但是当学习到了框架的时候,对于设计模式才有了一些更深入的了解,使用设计模式的代码在扩展性上会比暴力的代码更容易维护,特别是当一个程序猿离职了后,你去接手它的代码,里面是一大堆if else,这样真的会崩溃,修改都不知道从何下手
在这里插入图片描述

硬肝系列目录

创建型模式

23种设计模式之工厂模式

23种设计模式之抽象工厂模式

23种设计模式之建造者模式

23种设计模式之原型模式

23种设计模式之单例模式

结构型模式

23种设计模式之适配器模式

23种设计模式之桥梁模式

23种设计模式之代理模式

23种设计模式之外观模式

23种设计模式之装饰器模式

23种设计模式之享元模式

23种设计模式之组合模式

行为型模式

23种设计模式之责任链模式

23种设计模式之命令模式

23种设计模式之迭代器模式

23种设计模式之中介者模式

23种设计模式之备忘录模式

23种设计模式之观察者模式

到目前为止、23种设计模式的创建型模式已经给大家肝完了,现在我们进入到一个全新的章节,结构型模式!!!

什么是组合模式呢?

把一组结构相似的对象我们当作一个对象来对待,就像文件夹的存在形式一样,文件夹下面有子文件夹,就比如我们公司存在的上下级关系,总经理–副总经理–各个部门经理–员工,下面我们就用公司的上下级关系来给大家讲解组合模式

首先我们要先清楚,使用组合关系,必须是同一类对象,只不过这些对象是分上下级关系的,就像我们现在举得例子,不论职位,都是属于员工吧,那这样我们就可以抽象出来一个员工属性,里面包含的是员工姓名,性别,薪酬,还有最重要的一点,从属关系,这里我们用一个列表来标识

定义一个员工类

@Data
public class Employee {
    private String name;
    private String sex;
    private BigDecimal salary;
    private List<Employee> sub;

    public Employee(String name, String sex, BigDecimal salary) {
        this.name = name;
        this.sex = sex;
        this.salary = salary;
        sub = new ArrayList<>();
    }

    //添加下属
    public void add(Employee employee){
        sub.add(employee);
    }

    public void remove(Employee employee){
        sub.remove(employee);
    }
}

我们来编写测试代码

public static void main(String[] args) {
        //新建顶级的员工
        Employee boss = new Employee("mayun","1",new BigDecimal(200000));
        //新建子员工
        Employee headDevelopment = new Employee("hecl","1",new BigDecimal(100000));
        Employee headMarked = new Employee("dongmz","0",new BigDecimal(98000));
        //新建叶子员工
        Employee develop1 = new Employee("zhansan1","1",new BigDecimal(6000));
        Employee develop2 = new Employee("zhansan2","0",new BigDecimal(8000));

        Employee marked1 = new Employee("lisi1","0",new BigDecimal(12000));
        Employee marked2 = new Employee("lisi1","0",new BigDecimal(9000));

        boss.add(headDevelopment);
        boss.add(headMarked);

        headDevelopment.add(develop1);
        headDevelopment.add(develop2);

        headMarked.add(marked1);
        headMarked.add(marked2);
    }

根据上面代码我生成了如下结构图
在这里插入图片描述
也就是说在组合模式中我们维护一个list来存储下属员工信息,这样就可以维护一个组合关系模式

缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

完成:TO: 2021/3/24 22:59

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀顶峰相见的PET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值