Java常用设计模式————组合模式

引言

组合模式,是一种类似递归算法的结构性设计模式,通过以简单的 List ,组合本类对象,实现树状对象结构的“部分、整体”的层次。

它可以让调用程序不需要关心复杂对象与简单对象的区别,而统一地实现处理逻辑。

对于个体与整体存在一定共性的数据场景的展示非常有帮助,比如省市区的树状结构,领导与员工、校院系等。

一、组合模式的类图结构

用套娃形容组合模式非常贴切,其编码核心其实就是用数组来组合下级对象,而下级对象本身也属于此类实例。一般就是用于描述某种极具共性的实体类,如省、市、区;领导、员工等。

二、组合模式的代码实现

package com.mht.demo.组合模式;import java.util.ArrayList;
import java.util.List;public class Employee {private String name;private String dept;private int salary;/** 通过数组组合自身对象*/private List<Employee> subordinates;public Employee(String name, String dept, int salary) {this.name = name;this.dept = dept;this.salary = salary;this.subordinates = new ArrayList<>();}public void add(Employee emp) {this.subordinates.add(emp);}public void remove(Employee emp) {this.subordinates.remove(emp);}public List<Employee> getSubordinates() {return subordinates;}@Overridepublic String toString() {return "{\"name\":\"" + name + "\", \"dept\":\"" + dept + "\", \"salary\":\"" + salary + "\", \"subordinates\":"+ subordinates + "}";}
}

测试代码:

public class Client {public static void main(String[] args) {// 最上层员工,同时也是最高领导Employee ceo = new Employee("马云", "CEO", 30000);// 中层员工,同时也是中层领导Employee headSales = new Employee("Robert", "销售部", 20000);Employee headMarketing = new Employee("Michel", "市场部", 20000);// 基层员工,奋斗在业务一线Employee salesEmp = new Employee("Richard", "销售部", 10000);Employee salesEmp2 = new Employee("Rob", "销售部", 10000);Employee marketEmp = new Employee("Laura", "市场部", 10000);Employee marketEmp2 = new Employee("Bob", "市场部", 10000);ceo.add(headSales);ceo.add(headMarketing);headSales.add(salesEmp);headSales.add(salesEmp2);headMarketing.add(marketEmp);headMarketing.add(marketEmp2);// 打印CEO的管理层级System.out.println("CEO的管理层级:" + ceo);for (Employee headEmp : ceo.getSubordinates()) {System.out.println(headEmp);for (Employee subEmp : headEmp.getSubordinates()) {System.out.println(subEmp);}}}
}

测试结果:

CEO的管理层级:{"name":"马云", "dept":"CEO", "salary":"30000", "subordinates":[{"name":"Robert", "dept":"销售部", "salary":"20000", "subordinates":[{"name":"Richard", "dept":"销售部", "salary":"10000", "subordinates":[]}, {"name":"Rob", "dept":"销售部", "salary":"10000", "subordinates":[]}]}, {"name":"Michel", "dept":"市场部", "salary":"20000", "subordinates":[{"name":"Laura", "dept":"市场部", "salary":"10000", "subordinates":[]}, {"name":"Bob", "dept":"市场部", "salary":"10000", "subordinates":[]}]}]}
{"name":"Robert", "dept":"销售部", "salary":"20000", "subordinates":[{"name":"Richard", "dept":"销售部", "salary":"10000", "subordinates":[]}, {"name":"Rob", "dept":"销售部", "salary":"10000", "subordinates":[]}]}
{"name":"Richard", "dept":"销售部", "salary":"10000", "subordinates":[]}
{"name":"Rob", "dept":"销售部", "salary":"10000", "subordinates":[]}
{"name":"Michel", "dept":"市场部", "salary":"20000", "subordinates":[{"name":"Laura", "dept":"市场部", "salary":"10000", "subordinates":[]}, {"name":"Bob", "dept":"市场部", "salary":"10000", "subordinates":[]}]}
{"name":"Laura", "dept":"市场部", "salary":"10000", "subordinates":[]}
{"name":"Bob", "dept":"市场部", "salary":"10000", "subordinates":[]}

格式化后的结果:

{"name":"马云","dept":"CEO","salary":"30000","subordinates":[{"name":"Robert","dept":"销售部","salary":"20000","subordinates":[{"name":"Richard","dept":"销售部","salary":"10000","subordinates":[]},{"name":"Rob","dept":"销售部","salary":"10000","subordinates":[]}]},{"name":"Michel","dept":"市场部","salary":"20000","subordinates":[{"name":"Laura","dept":"市场部","salary":"10000","subordinates":[]},{"name":"Bob","dept":"市场部","salary":"10000","subordinates":[]}]}]
}

总结

组合模式的使用场景非常特定,一般就是在输出打印树状结构型数据时才会用到。

它模糊了简单元素和复杂元素的概念,客户端程序可以像处理简单元素一样来处理复杂元素,从而使客户端与复杂元素的内部结构解耦。

定义时,通过List组织自身对象。同时也并未用到抽象类或接口。

注意为数组提供必要的添加和移除方法。

 

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

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

相关文章

Java常用设计模式————外观模式

引言 外观模式&#xff08;Facade Pattern&#xff09;&#xff0c;又叫“过程模式”。外观模式为子系统中的一组接口提供一个一致的入口&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一组子系统更加易用。 一、案例分析 生活中有很多类似的案例&#xf…

Java常用设计模式————享元模式

引言 享元模式&#xff0c;也叫蝇量模式&#xff08;Flyweight Pattern&#xff09;。运用共享技术有效地支持大量细粒度的对象。 享元模式常用于系统底层开发&#xff0c;解决系统的性能问题。例如数据库连接池&#xff0c;里面都是创建好的连接对象&#xff0c;在这些连接对…

IDEA——常用基础设置

一、设置入口 File—>Settings... 或者 在工具栏的“小扳手”图标。 二、主题设置 三、编辑通用设置 设置面板中的 Editor 3.1 自动导包 可以设置IDEA自动为程序导包&#xff0c;在书写时加入准确的导包&#xff0c;在书写时优化导包&#xff08;自动去掉未使用的&#…

IDEA——常用快捷键

引言 总结 IDEA 的常用快捷键&#xff0c;除了部分快捷键与 Eclipse 保持一致之外&#xff0c;枚举更多的实用快捷键。 一、如何设置快捷键 在 Settings -> Keymap 中&#xff0c;下拉框里选择 Eclipse &#xff0c;即可将 IDEA 的快捷键设置为与 Eclipse 保持一致。但并…

IDEA——常用代码模板

引言 IDEA 提供了一些内置的代码模板&#xff0c;可以让开发者快速方便的使用&#xff0c;当然 eclipse 中也是有的&#xff0c;比如输入 syso 快速生成输出语句&#xff0c;main 快速生成主函数等。 idea 的模板设置都在 Settings --> Live Templates 和 General-->Po…

IDEA——Git 的设置与使用

引言 在本机下载好 Git 之后&#xff0c;再去在 IDEA 中设置 Git 相关的参数。详细的 Git 操作和 Eclipse 大同小异&#xff0c;可以移步至&#xff1a;《Git必知必会》 一、设置Git执行程序路径 二、导入一个新的远程 git 托管项目 打开 File ——> New ——> Project…

IDEA——Maven的配置与使用

引言 简单介绍一下如何在 idea 中配置maven&#xff0c;以及如何去使用 maven 。 一、配置 Maven home Maven home 和 settings 文件一般都需要进行重新设置&#xff0c;关联到本机已经安装好的 maven 版本&#xff0c;settings 这里可以使用默认&#xff0c;也可以设置为 ma…

Spring Cloud Alibaba——Nacos实现服务治理

引言 本博客总结微服务开发中各个微服务调用的实现&#xff0c;并使用 Nacos 完成服务注册和发现。 文章中会涉及到 maven 的使用&#xff0c;以及 spring boot 的一些知识。开发工具采用 IDEA 2020.2。 设计一个电商订单和商品购买微服务&#xff0c;实现微服务的注册发现与…

Spring Cloud —— Feign 实现服务调用

引言 本篇博客简单介绍 Feign 的基础知识和基本应用&#xff0c;以前一篇博客《Spring Cloud Alibaba——Nacos实现服务治理》为代码基础&#xff0c;实现更简单的微服务调用方式。 一、什么是Feign restTemplate 实现的微服务调用方式&#xff1a; // 调用商品微服务&…

Spring Cloud —— 负载均衡与 Ribbon 应用

引言 本篇博客简单介绍微服务负载均衡的概念&#xff0c;并通过 IDEA 多端口启动应用的方式&#xff0c;模拟多个应用实例&#xff0c;使用自定义和 Ribbon 两种方式实现基本的负载均衡策略。 微服务代码以《Spring Cloud Alibaba——Nacos实现服务治理》为基础。 一、什么是…

Spring —— 容器内部逻辑

引言 上一篇关于IoC容器的详解《Spring —— IoC 容器详解》真是工程浩大&#xff0c;可以说Spring官网对核心中的核心IOC容器做了非常全面的使用说明&#xff0c;包括在《Spring揭秘》中让我一直没有成功的Method Injection&#xff0c;官网也解决了我的疑惑&#xff0c;并最…

2020 年度总结

2020年给我的感觉是短平快的一年。 由于年初的新冠肺炎疫情&#xff0c;我大半年都呆在北京的破旧出租屋里写代码。整个春天和夏天&#xff0c;平平无奇。 2月1日返京&#xff0c;居家办公&#xff0c;夜跑。8月复工&#xff0c;疯狂爆痘、烂脸&#xff0c;月末落户天津。9月…

JDBC——概述与JDBC的使用

引言 一直希望深入学习一下数据库持久化技术&#xff0c;接触过Hibernate、Mybatis&#xff0c;也使用过Spring事务管理来控制回滚操作&#xff0c;但是越发觉得底层知识有一定的知识盲区和空洞。 很多ORM框架都是基于JDBC规范来进行构建的&#xff0c;因此&#xff0c;学习J…

JDBC——编程式事务的实现逻辑

引言 数据库事务的概念和基础&#xff0c;总结在《MySQL 基础 ————事务与隔离级别总结》。 本篇博客通过“JDBC 纯编码”方式实现事务控制&#xff0c;完成一个 A 给 B 转账的小功能&#xff0c;在进一步熟练JDBC的编程流程的同时&#xff0c;重点关注 Java 语言如何操作…

排序算法——插入排序

一、算法思想 给定一个无序数列&#xff0c;模拟一个指针从第0位开始向后&#xff0c;始终保持当前位置左边的数列是有序的。 指针位置上的元素依次与前面的元素比较&#xff0c;当遇到小于自己的数或右边已经没有元素时&#xff0c;都停止比较&#xff0c;开始下一轮。 生活…

Linux 底层原理 —— epoll 与多路复用

引言 epoll 是 Linux 系统下高性能网络服务的必备技术&#xff0c;很多面试中高频出现的 Nginx、Redis 都使用了这一技术&#xff0c;本文总结 linux 多路复用模型的演变过程&#xff0c;看一看epoll 是如何实现高性能的。 一、相关基础知识 1.1 文件描述符 文件描述符&…

异或运算的应用

一、基础知识 异或运算&#xff0c;相异为1。 异或运算是一种常用的位运算&#xff0c;在算法题中&#xff0c;对于避免额外的空间复杂度有独特的用处。 异或运算也被称为“无进位相加”&#xff0c;它具有以下特性&#xff1a; 特性1&#xff1a;0 ^ N N 特性2&#xff1a…

单向队列、双端队列、栈的模型实现

引言 自己实现简单的队列、栈的逻辑结构。 队列都包含头和尾两个指针&#xff0c;简单的单向队列只能在一端&#xff08;如&#xff1a;head端&#xff09;入列&#xff0c;在另一端&#xff08;如&#xff1a;tail 端&#xff09;出列&#xff1b;双端队列可以在 head 进出&…

递归算法及其时间复杂度分析

引言 “递归” 一词是比较专业的计算机术语&#xff0c;在现实生活中&#xff0c;有一个更可爱的词——“套娃”。如果把“递归算法”叫做“套娃算法”&#xff0c;或许可以减少一些恐惧程度。 套娃是有限的&#xff0c;同样&#xff0c;递归也是有限的&#xff0c;这和我们经…

算法设计中的基础常用代码

引言 本篇博客旨在记录一些基础算法知识的常见组合用法&#xff0c;以及何时使用&#xff0c;需要注意的问题等&#xff0c;长期更新。 为什么要这样总结呢&#xff1f;难道掌握了位运算、常用算法工具API的定义还不够吗&#xff1f; 这是因为某些知识比如 &、 |、 ~、 …