设计模式之组合模式

文章目录

一、介绍

组合模式(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();
}

运行代码,输出如下:

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

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

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

相关推荐
寻星探路1 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧3 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法4 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7254 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎5 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄5 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿5 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds5 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹5 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚5 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言