设计模式之组合模式

文章目录

一、介绍

组合模式(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 小时前
Java学习第十天
java·学习
matlabgoodboy1 小时前
计算机毕设代做|Java Python Matlab APP 全套开发设计
java·python·课程设计
程序员雷欧2 小时前
环形缓冲区深度解析:从基础原理到Disruptor源码的全面剖析
java
xiaoqiMikko2 小时前
Dependabot 面板全绿,不代表你的 Tomcat 没洞
java·spring boot
前端开发张小七3 小时前
Java 学习笔记 · 第三课:多线程与并发编程(线程、同步、死锁、Lock、乐观锁与悲观锁)
java·后端·程序员
花生了什么事o3 小时前
JVM 垃圾回收:对象如何被判定和回收
java·jvm
evans在进步3 小时前
HashMap 为什么线程不安全?ConcurrentHashMap 如何解决?
java·spring boot·spring
我命由我123454 小时前
匈牙利命名法
java·服务器·后端·学习·java-ee·kotlin·学习方法
闲猫4 小时前
LangChain / Integrations / Integrations by component / Tool
java·数据库·langchain
小田的博客4 小时前
SAP MM 供应商银行主数据更新报错!message R1228!
android·java·服务器