设计模式之组合模式

文章目录

一、介绍

组合模式(Composite Pattern),属于结构型设计模式 。组合模式常用于树形的数据结构 ,比如:多级菜单部门层级关系html文本中的dom树 。它的特点是使用户对单个对象组合对象的使用是相同的。

二、案例

我们以公司员工为例 ,不同的员工可向下管理多个员工,而每一个员工都有一个共同的动作:领工资

根据该案例描述,我们对员工进行以下定义

java 复制代码
public interface Employ {

    /**
     * 领工资
     */
    void getSalary();

    /**
     * 添加员工
     */
    void addEmployee(Employ employ);

    /**
     * 获取当前员工可管理的员工
     */
    List<Employ> children();
}

添加员工实现类(EmployImpl):

java 复制代码
public class EmployImpl implements Employ {
    // 员工姓名
    private String name;
    // 员工工资
    private String salary;
	// 可管理的员工集合
    private List<Employ> employList = new ArrayList<>();

    // 通过姓名和薪资实例化一个员工
    public EmployImpl(String name, String salary) {
        this.name = name;
        this.salary = salary;
    }
    
	// 领工资
    @Override
    public void getSalary() {
        System.out.println("员工姓名:" + name + ",领取工资:" + salary);
		// 管理的员工集合也领工资
        for (Employ employ : employList) {
            employ.getSalary();
        }
    }

    // 添加一个员工
    @Override
    public void addEmployee(Employ employ) {
        employList.add(employ);
    }

    // 获取管理的员工集合
    @Override
    public List<Employ> children() {
        return employList;
    }

    @Override
    public String toString() {
        return name;
    }
}

下面我们通过代码进行测试,首先定义了6个员工,然后通过addEmployee()方法对员工的层级结构进行分配,最后通过查询指定员工可管理的员工集合(children )、并对其中一个员工发工资(getSalary())向下逐级发工资。通过这种类似蝴蝶效应的连锁反应演示组合模式的精髓(只不过连锁反应中所有反应都相同罢了)。

java 复制代码
public static void main(String[] args) {
    Employ tom = new EmployImpl("汤姆", "22");
    Employ jerry = new EmployImpl("杰瑞", "33");
    Employ jack = new EmployImpl("杰克", "44");
    Employ rose = new EmployImpl("肉丝", "55");
    Employ diJia = new EmployImpl("迪迦", "66");
    Employ taiLuo = new EmployImpl("泰罗", "77");

    // 汤姆管理杰瑞、杰克
    tom.addEmployee(jerry);
    tom.addEmployee(jack);
    // 杰瑞管理肉丝
    jerry.addEmployee(rose);
    // 杰克管理迪迦、泰罗
    jack.addEmployee(diJia);
    jack.addEmployee(taiLuo);

    List<Employ> children1 = tom.children();
    System.out.println("汤姆管理的员工:" + children1);
    List<Employ> children2 = jerry.children();
    System.out.println("杰瑞管理的员工:" + children2);
    List<Employ> children3 = jack.children();
    System.out.println("杰克管理的员工:" + children3);
    List<Employ> children4 = rose.children();
    System.out.println("肉丝管理的员工:" + children4);
    List<Employ> children5 = diJia.children();
    System.out.println("迪迦管理的员工:" + children5);
    List<Employ> children6 = taiLuo.children();
    System.out.println("泰罗管理的员工:" + children6);

    tom.getSalary();
}

运行代码,输出如下:

以上就是组合模式的案例演示,希望通过本篇文章的阅读,能使各位朋友对组合模式有更深入的理解。

纸上得来终觉浅,绝知此事要躬行。

------------------------我是万万岁,我们下期再见------------------------

相关推荐
ideal-cs1 分钟前
总结:生产环境Release、Snapshot两种包版本该如何管理与发布构建
java·maven·snapshot·release
yangminlei2 分钟前
Spring Boot Starter自定义开发 构建企业级组件库
java·spring boot·后端
牛奶咖啡133 分钟前
CI/CD——在jenkins中构建流程实现springboot项目的自动化构建与部署
java·ci/cd·k8s·jenkins·springboot·springboot制作镜像·使用源码项目制作镜像
桔筐3 分钟前
Redis 无锁化库存扣减方案(INCR + SETNX 实现,高并发不超卖)
java·redis
AI人工智能+电脑小能手6 分钟前
【大白话说Java面试题 第44题】【JVM篇】第4题:什么时候会触发 Young GC?什么时候会触发 Full GC?
java·开发语言·jvm·后端·面试
Java面试题总结18 分钟前
【设计模式03】使用模版模式+责任链模式优化实战
设计模式·责任链模式
小妖66618 分钟前
js 实现python的SortedList有序集合
java·javascript·python
梦梦代码精20 分钟前
电商系统的核心难点:订单与营销系统如何设计?——LikeShop 架构深度拆解(规则计算与状态一致性)
java·开发语言·低代码·架构·开源·github
SZLSDH22 分钟前
专项治理场景下,数字孪生IOC的架构适配逻辑:以智慧河湖监管为例
java·大数据·架构·数据可视化
隐退山林22 分钟前
JavaEE进阶:SpringBoot日志
java·开发语言