结构型(六) - 组合模式

news2024/7/4 6:02:55

一、概念

组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

使用场景:组合结构不常用,需要部分与整体的层次关系为树形结构,并且部分与整体的对象是能让客户端能统一对待、不需区分的对象,例如:文件管理系统,在遍历查找的时候,文件和文件夹对我们来说不做区分,可以做到逻辑统一。

二、实现

这里借鉴参考文章公司和职员的例子,公司的组织结构包含部门和员工两种数据类型。其中,部门又可以包含子部门和员工。然后通过构建树形结构来遍历计算公司总的工资支出成本。

1、定义公司及员工的父类HumanResource,用来统一处理薪资计算。

public abstract class HumanResource { 
    protected long id; 
    protected double salary; 
    public HumanResource(long id) { 
        this.id = id; 
    } 
    
    public long getId() {
       return id; 
    } 

    public abstract double calculateSalary();
}

2、员工和部门

#Employee 
public class Employee extends HumanResource { 
    public Employee(long id, double salary) {
       super(id); this.salary = salary;
    } 

    @Override 
    public double calculateSalary() {
       return salary; 
    }
}

#Department 
public class Department extends HumanResource { 
    private List<HumanResource> subNodes = new ArrayList<>();
    public Department(long id) { 
        super(id); 
    } 

    @Override 
    public double calculateSalary() {
       double totalSalary = 0;
       if (subNodes.size() <= 0) {
            return 0;
        }

       for (HumanResource hr : subNodes) { 
            totalSalary += hr.calculateSalary(); 
       } 
       this.salary = totalSalary; 
       return totalSalary;
    } 
    
    public void addSubNode(HumanResource hr) {
       subNodes.add(hr);
    }
}

3、我们建立一个树形部门架构,如下图:
组合树形结构.PNG

测试类

public class Client {
    public static void main(String[] args) {
        Department department = new Department(0);
        Department departmentA = new Department(1);
        Department departmentA1 = new Department(2);
        Department departmentB = new Department(3);
        Department departmentB1 = new Department(4);

        Employee employee0 = new Employee(0,50000);
        Employee employee1 = new Employee(1,8000);
        Employee employee2 = new Employee(2,8000);
        Employee employee3 = new Employee(3,4000);
        Employee employee4 = new Employee(4,4000);

        department.addSubNode(departmentA);
        department.addSubNode(departmentB);
        department.addSubNode(employee0);

        departmentA.addSubNode(employee1);
        departmentA.addSubNode(departmentA1);
        departmentB.addSubNode(employee2);
        departmentB.addSubNode(departmentB1);

        departmentA1.addSubNode(employee3);
        departmentB1.addSubNode(employee4);

        double salary = department.calculateSalary();
        System.out.println("公司工资开支:" + salary);
    }
}

4、运行结果
组合模式.png

参考文章:
极客时间《设计模式》(王争)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/910969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络协议详解之STP

目录 一、STP协议&#xff08;生成树&#xff09; 1.1 生成树协议核心知识点&#xff1a; 1.2 生成树协议与导致问题&#xff1a; 生成树含义&#xff1a; 1.3 802.1D 规则&#xff1a; 802.1D 缺点&#xff1a; 1.4 PVST cisco私有 1.5 PVST 1.6 快速生成树 快速的原…

内网穿透软件给企业带来哪些改变?快解析怎么样?

随着科技的发达&#xff0c;使得信息交流变得非常重要。但是企业在使用互联网进行数据传输时面临着一些困境&#xff0c;比如企业内部的服务器无法直接与外部网络进行通信&#xff0c;导致无法远程访问企业内部资源。解决这一问题的有效方法是使用内网穿透软件。下面给大家详细…

组合总和-LeetCode

给你一个无重复元素的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的所有不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序返回这些组合。 candidates 中的同一个数字可以无限制重复被选取 。如果至少一个…

WSL2和本地windows端口互通

众所周知 WSL 默认安装后&#xff0c;只允许windows访问 Windows Subsystem for Linux&#xff0c;而WSL是不能反之访问本地windows。我之前用vmware的思路认为是nat的网络模式&#xff0c;于是改成了桥接&#xff0c;结果wsl的桥接模式被我改的能访问本地&#xff0c;但是却不…

猜数字小游戏python

---------------------------END--------------------------- 题外话 “不是只有程序员才要学编程&#xff1f;&#xff01;” 认真查了一下招聘网站&#xff0c;发现它其实早已变成一项全民的基本技能了。 连国企都纷纷要求大家学Python! 世界飞速发展&#xff0c;互联网…

【0基础入门Python Web笔记】二、python 之逻辑运算和制流程语句

二、python 之逻辑运算和制流程语句 逻辑运算控制流程语句条件语句&#xff08;if语句&#xff09;循环结构&#xff08;for循环、while循环&#xff09;continue、break和pass关键字控制流程语句的嵌套以及elif 更多实战项目可进入下方官网 逻辑运算 Python提供基本的逻辑运算…

【线程池】换个姿势来看线程池中不一样的阻塞队列(一)

前言 本文中无特别说明的话&#xff0c;线程池指的是 java.util.concurrent #ThreadPoolExecutor 本文只探讨线程池中阻塞队列相关&#xff0c;暂时不对线程池的其他方面进行说明&#xff0c;如果对线程池感兴趣的话&#xff0c;接下来几天我会多分享些和线程池相关的知识&…

基于蜻蜓算法优化的BP神经网络(预测应用) - 附代码

基于蜻蜓算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于蜻蜓算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.蜻蜓优化BP神经网络2.1 BP神经网络参数设置2.2 蜻蜓算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

软件测试报告:包含哪些内容?

软件测试报告的内容 软件测试报告通常包括以下内容&#xff1a; 1、项目背景&#xff1a;介绍测试报告的编写目的、测试系统名称、测试环境和用到的专业术语。 2、需求内容&#xff1a;罗列该项目的测试功能点,具体到每个模块功能&#xff0c;以新增的功能和修改的功能为主&…

jmeter HTTP请求默认值

首先&#xff0c;打开JMeter并创建一个新的测试计划。 右键单击测试计划&#xff0c;选择"添加" > “配置元件” > “HTTP请求默认值”。 在HTTP请求默认值中&#xff0c;您可以设置全局的HTTP请求属性&#xff0c;例如&#xff1a; 服务器地址&#xff1a…

cad图怎么转换成pdf格式?一招教你轻松转换

将CAD文件转换成PDF格式有很多优势。首先&#xff0c;PDF格式是一种非常流行的文件格式&#xff0c;几乎所有电脑上都可以打开。这意味着即使将PDF文件发送给其他人&#xff0c;他们也可以轻松地查看文件&#xff0c;此外&#xff0c;PDF格式可以保留CAD文件的图形和布局&#…

Rancher使用cert-manager安装报错解决

报错&#xff1a; rancher-rke-01:~/rke/rancher-helm/rancher # helm install rancher rancher-stable/rancher --namespace cattle-system --set hostnamewww.rancher.local Error: INSTALLATION FAILED: Internal error occurred: failed calling webhook "webhook…

Redis-设置密码linux服务器

操作步骤 打开Redis的配置文件&#xff0c;通常位于 /etc/redis/redis.conf。在配置文件中找到 #requirepass 或 requirepass 的行&#xff0c;如果存在的话&#xff0c;取消行首的注释符号 #。将密码设置为你想要的值&#xff0c;例如 requirepass YourPassword。确保将 Your…

嵌入式蓝海变红海?其实是大浪淘沙!

嵌入式是当下热门的职业方向之一&#xff0c;吸引了众多求职者的目光。然而&#xff0c;有人担心大家一拥而上&#xff0c;导致嵌入式就业竞争激烈&#xff0c;找工作难度大。其实&#xff0c;嵌入式行业的竞争并非无法逾越的天堑&#xff0c;也远远没有从蓝海变成红海&#xf…

RocketMQ MQTT使用教程

一、概览 传统的消息队列MQ主要应用于服务&#xff08;端&#xff09;之间的消息通信&#xff0c;比如电商领域的交易消息、支付消息、物流消息等等。然而在消息这个大类下&#xff0c;还有一个非常重要且常见的消息领域&#xff0c;即IoT类终端设备消息。近些年&#xff0c;我…

工采电子受邀参加:维科网举办的2023全球数字经济产业大会

先进电子科技将引领着绿色出行、绿色能源、绿色制造的未来发展&#xff0c;协助我们应对环境、经济及社会等种种机遇与挑战。让我们聚焦并探讨如何持续促进智能化、网联化、低碳化、电动化技术的融合发展&#xff0c;牵引和拉动并实现产业效益&#xff0c;相互赋能&#xff0c;…

算法与数据结构-二叉树

文章目录 什么是树什么是二叉树如何表示&#xff08;或者存储&#xff09;一棵二叉树链式存储法顺序存储法二叉树的分类 二叉树的遍历二叉查找树1. 二叉查找树的查找操作2. 二叉查找树的插入操作3. 二叉查找树的删除操作4.支持重复数据的二叉查找树 红黑树什么是“平衡二叉查找…

【SpringCloud】Sleuth链路追踪使用

文章目录 概述配置YMLPOM示例调用路径 概述 能够查看服务调用链路 官网&#xff1a; https://github.com/spring-cloud/spring-cloud-sleuth 在分布式系统中提供追踪解决方案并且兼容支持了zipkin 配置 SpringCloud从F版起已不需要自己构建Zipkin Server了&#xff0c;只需调…

成都大运会,保障大型活动无线电安全需要…

成都大运会 7月28日&#xff0c;备受关注的第31届世界大学生夏季运动会在成都正式开幕。据悉&#xff0c;这是全球首个5G加持的智慧大运会&#xff0c;也是众多成熟信息技术的综合“应用场”。使用基于5G三千兆、云网、8K超高清视频等技术&#xff0c;在比赛现场搭建多路8K摄像…

item_search_shop-获得淘宝/天猫店铺的所有商品

一、接口参数说明&#xff1a; item_search_shop-获得店铺的所有商品&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_search_shop 名称类型必须描述keyString是调用key&…