当前位置: 首页 > news >正文

【结构型】树形结构的应用王者,组合模式

在这里插入图片描述

目录

    • 一、组合模式
      • 1、组合模式是什么?
      • 2、组合模式的主要参与者:
    • 二、优化案例:文件系统
      • 1、不使用组合模式
      • 2、通过组合模式优化上面代码
        • 优化点:
    • 三、使用组合模式有哪些优势
      • 1、统一接口,简化客户端代码
      • 2、递归结构处理方便
      • 3、易扩展
      • 4、简化客户端操作
      • 5、动态组合灵活
    • 四、适用场景
    • 五、组合模式的劣势
    • 六、在jdk源码中,哪些地方应用了组合模式,代码举例说明一下
      • 1、AWT(Abstract Window Toolkit)中的组件树
        • (1)代码分析:
        • (2)JDK 源码中的示例(简化):
        • (3)组合模式分析:
      • 2、集合框架中的 java.util 包
        • (1)代码分析:
        • (2)JDK 源码中的示例:
        • (3)组合模式分析:
      • 3、小总结
    • 七、总结
      • 在这里,直接用 OpenAI o1草莓大模型

在日常开发中,我们往往忽视了设计模式的重要性。这可能是因为项目时间紧迫,或者对设计模式理解不深。其实,很多时候我们可能在不经意间已经使用了某些模式。

重要的是要有意识地学习和应用,让代码更加优雅和高效。也许是时候重新审视我们的编程实践,将设计模式融入其中了。

今天由浅入深,重学【组合模式】,让我们一起“重学设计模式”。

一、组合模式

1、组合模式是什么?

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户可以像使用单个对象一样使用对象组合,简化了复杂结构的处理。

2、组合模式的主要参与者:

  1. Component(抽象组件):定义了对象的接口,所有组合对象和叶子节点都应实现它。
  2. Leaf(叶子节点):表示没有子节点的对象,即树的末端。
  3. Composite(组合对象):表示拥有子节点的对象。它不仅实现了 Component 接口,还能够存储并管理其子节点。

二、优化案例:文件系统

文件系统是组合模式的经典案例。文件系统中的文件夹可以包含文件或其他文件夹。无论是文件还是文件夹,它们都应该有一些共同的行为,例如显示名称或计算大小。

1、不使用组合模式

如果不采用组合模式,代码将需要分别处理叶子节点(如文件)和组合对象(如文件夹),这会导致代码复杂性增加。没有统一的接口意味着文件和文件夹需要不同的处理逻辑,导致代码的重复和不易扩展。

每次添加新的文件类型或子文件夹时,都需要修改已有代码,增加文件和文件夹的处理逻辑,代码会变得难以维护和扩展。

  1. 冗余代码:Folder 类中有两个集合,一个存储文件,另一个存储子文件夹。由于没有通用接口,必须为文件和文件夹分别编写逻辑。
  2. 缺乏一致性:要操作文件和文件夹时,必须分别对待。例如,showDetails() 方法中,文件和文件夹需要分开处理,无法将它们统一成一个对象。
  3. 扩展性差:如果将来想要添加新的类型,比如符号链接、压缩文件等,必须分别为它们定义类,并在每个相关的逻辑中添加处理它们的代码。
public class File {private String name;private int size;public File(String name, int size) {this.name = name;this.size = size;}public void showDetails() {System.out.println("File: " + name + " (Size: " + size + " KB)");}
}public class Folder {private String name;private List<File> files = new ArrayList<>();private List<Folder> subFolders = new ArrayList<>();public Folder(String name) {this.name = name;}public void addFile(File file) {files.add(file);}public void addFolder(Folder folder) {subFolders.add(folder);}public void showDetails() {System.out.println("Folder: " + name);// 显示文件夹中的文件for (File file : files) {file.showDetails();}// 递归显示子文件夹中的内容for (Folder folder : subFolders) {folder.showDetails();}}
}public class Test {public static void main(String[] args) {File file1 = new File("Document.txt", 50);File file2 = new File("Photo.jpg", 200);Folder folder = new Folder("MyFolder");folder.addFile(file1);folder.addFile(file2);File file3 = new File("test0.txt", 50);File file4 = new File("test1.jpg", 200);Folder folderRoot = new Folder("MyFolderRoot");folderRoot.addFile(file3);folderRoot.addFile(file4);folderRoot.addFolder(folder);folderRoot.showDetails();}
}

2、通过组合模式优化上面代码

在电子商务网站的产品目录中,可以通过组合模式管理产品和产品类别。每个产品(叶子节点)具有价格和描述,产品类别(组合对象)可以包含其他类别或产品。通过使用组合模式,可以简化查询价格、库存和类别层次的操作。

优化点:
  1. 简化层次结构:在系统中,产品与类别都遵循相同的接口,可以统一处理产品和类别。
  2. 灵活性:可以动态地增加或移除产品和类别,提高系统的可扩展性和维护性。

这个模式特别适合应用于具有递归或树形结构的场景。

文件和文件夹可以看作统一的组件,处理逻辑一致,新增类型时只需实现抽象接口,原有代码不需要修改。

/*** 抽象组件*/
public abstract class FileSystemComponent {public abstract void showDetails();
}/*** 叶子节点:文件*/
public class File extends FileSystemComponent {private String name;private int size;public File(String name, int size) {this.name = name;this.size = size;}@Overridepublic void showDetails() {System.out.println("File: " + name + " (Size: " + size + " KB)");}
}/*** 组合对象:文件夹*/
public class Folder extends FileSystemComponent {private String name;private List<FileSystemComponent> components = new ArrayList<>();public Folder(String name) {this.name = name;}public void addComponent(FileSystemComponent component) {components.add(component);}@Overridepublic void showDetails() {System.out.println("Folder: " + name);for (FileSystemComponent component : components) {component.showDetails();}}
}public class CombinationClient {public static void main(String[] args) {FileSystemComponent file1 = new File("Document.txt", 50);FileSystemComponent file2 = new File("Photo.jpg", 200);Folder folder = new Folder("MyFolder");folder.addComponent(file1);folder.addComponent(file2);File file3 = new File("test0.txt", 50);File file4 = new File("test1.jpg", 200);Folder folderRoot = new Folder("MyFolderRoot");folderRoot.addComponent(file3);folderRoot.addComponent(file4);folderRoot.addComponent(folder);folderRoot.showDetails();}
}

三、使用组合模式有哪些优势

1、统一接口,简化客户端代码

组合模式为对象和对象组合提供了统一的接口,客户端可以一致地操作单个对象和组合对象,而不必区分它们是叶子还是组合。这种一致性减少了处理不同类型对象的复杂度,简化了代码。

2、递归结构处理方便

组合模式特别适合处理树形或递归结构,如文件系统、组织结构等。通过递归调用,可以轻松遍历整个结构(无论是文件还是文件夹),不必写不同的处理逻辑。

3、易扩展

新增叶子节点或组合对象时,只需实现相同的接口,不需要修改已有的代码。组合模式具有开放-封闭原则的优势,使系统更加灵活、易于扩展。

4、简化客户端操作

客户端不再需要关心对象的具体类型(叶子或组合),只需处理抽象组件。这使得代码更加简洁,也减少了错误处理的复杂性。

5、动态组合灵活

通过组合模式,可以动态地组合对象,而无需预先定义复杂的类结构。这为复杂对象提供了灵活的处理方式,使得系统结构更具弹性。

四、适用场景

  1. 树形结构(层次结构): 组合模式非常适用于需要表示“部分-整体”关系的场景,尤其是树形结构。例如,文件系统、组织结构图、产品目录树、菜单系统等。
    • 文件系统:文件和文件夹之间的层次关系可以通过组合模式来轻松管理。无论是单个文件,还是包含子文件夹的文件夹,都可以通过相同的方式处理。
    • 组织结构图:公司中员工和部门之间存在层次结构,员工可以属于某个部门,部门可以属于其他部门,通过组合模式,可以方便地管理和展示这种结构。
  2. GUI控件(图形用户界面): GUI 组件经常包含其他组件,如按钮、窗口、面板等。组合模式可以用来管理这些图形控件,让它们统一处理。例如,一个窗口可能包含面板,面板中包含按钮和文本框,这些控件都可以通过相同的接口进行管理和渲染。
  3. 菜单系统: 菜单项可以包含子菜单,也可以是普通的菜单项。组合模式可以用于菜单系统的设计,使得菜单项和子菜单都实现相同的接口,从而简化菜单的显示和操作。
  4. 产品目录和分类管理: 电子商务网站中,产品可以属于某个类别,类别之间也有层次结构。组合模式可以用于管理产品和类别,通过统一接口可以轻松查询、操作或统计不同类别下的产品信息。
  5. 图形绘制系统: 在图形绘制系统中,复杂的图形可能是由多个简单图形组成的。组合模式允许将简单图形和复杂图形统一起来处理,方便实现图形的递归绘制和操作。
  6. 权限系统: 在权限管理中,角色和权限之间可能存在层次关系,一个角色可以拥有多个权限,权限可以包含子权限。组合模式可以用于简化权限系统的设计,使得权限的分配和管理更加灵活。
  7. 编译器中的抽象语法树(AST): 编译器在解析源代码时,会生成抽象语法树(AST),其中每个节点可以是语法结构的一个元素(如表达式、语句等)。通过组合模式,编译器可以对这些节点进行统一处理,而不需要关心它们的具体类型。

五、组合模式的劣势

虽然组合模式有很多优势,但它也有一些潜在的劣势:

  1. 过度抽象:为了实现通用接口,可能导致系统设计过于抽象和复杂,尤其是在层次结构非常深的情况下,增加了理解和维护的难度。
  2. 性能问题:由于组合模式需要递归处理对象结构,在大规模、深层次的树形结构中,递归操作可能带来性能问题。
  3. 类型安全问题:组合模式统一了叶子节点和组合对象的接口,有时可能难以强制类型检查。例如,某些操作只对叶子节点有效,调用这些操作时可能需要额外的类型判断。

六、在jdk源码中,哪些地方应用了组合模式,代码举例说明一下

在JDK源码中,组合模式被广泛应用于处理树形或层次结构的数据结构和设计,最典型的例子之一是 java.awt 包中的 Component 类,以及集合框架中的 java.util 包。

以下是两个常见的应用场景:

1、AWT(Abstract Window Toolkit)中的组件树

在 java.awt 包中,Component 类和 Container 类使用了组合模式。Container 代表可以包含子组件的对象,而 Component 是一个抽象组件,代表所有的 GUI 元素。Container 既可以是单个组件(叶子),也可以是组合组件(容器),从而形成了一个树形的 GUI 组件层次结构。

(1)代码分析:
  1. Component 类是所有 GUI 元素的基类。
  2. Container 类是 Component 的子类,它可以包含多个子组件。
(2)JDK 源码中的示例(简化):
// java.awt.Component
public abstract class Component {// 省略大量方法public void paint(Graphics g) {// 绘制组件的代码}
}// java.awt.Container
public class Container extends Component {// 存储子组件private List<Component> componentList = new ArrayList<>();public void add(Component comp) {componentList.add(comp);}public void remove(Component comp) {componentList.remove(comp);}@Overridepublic void paint(Graphics g) {super.paint(g);// 递归调用子组件的 paint 方法for (Component comp : componentList) {comp.paint(g);}}
}
(3)组合模式分析:
  1. Component 是一个抽象类,定义了所有组件的通用接口。
  2. Container 是一个组合对象,包含其他组件,并可以递归地管理和绘制这些组件。
  3. 在使用时,GUI 系统可以统一处理 Component 对象,不论它是叶子组件(如按钮、文本框),还是组合组件(如面板、窗口)。

2、集合框架中的 java.util 包

在 Java 集合框架中,List、Set、Map 等接口也使用了组合模式。集合类中既有可以直接存储元素的类(如 ArrayList、HashSet),也有可以组合其他集合的类(如 Collections.unmodifiableList、Collections.synchronizedList 等)。

(1)代码分析:
  1. List 接口是所有列表的通用接口。
  2. ArrayList 实现了 List 接口,代表叶子节点,可以直接存储元素。
  3. Collections.unmodifiableList 通过组合模式,将一个已有的列表封装起来,实现不可修改的列表。
(2)JDK 源码中的示例:
// java.util.List (接口)
public interface List<E> extends Collection<E> {// 定义列表的通用方法boolean add(E e);E get(int index);// 省略其他方法
}// java.util.ArrayList (叶子节点)
public class ArrayList<E> extends AbstractList<E> implements List<E> {private Object[] elementData;private int size;public ArrayList() {elementData = new Object[10];}@Overridepublic boolean add(E e) {// 添加元素的逻辑elementData[size++] = e;return true;}@Overridepublic E get(int index) {return (E) elementData[index];}// 省略其他方法
}// java.util.Collections.unmodifiableList (组合对象)
public static <T> List<T> unmodifiableList(List<? extends T> list) {return new UnmodifiableList<>(list);
}// 内部类,包装一个已有的 List
private static class UnmodifiableList<E> extends AbstractList<E> {private final List<? extends E> list;UnmodifiableList(List<? extends E> list) {this.list = Objects.requireNonNull(list);}@Overridepublic E get(int index) {return list.get(index);}@Overridepublic boolean add(E e) {throw new UnsupportedOperationException();}
}
(3)组合模式分析:
  1. List 接口是抽象组件,定义了所有列表操作的通用方法。
  2. ArrayList 是具体的叶子节点,可以直接存储和操作元素。
  3. UnmodifiableList 是一个组合对象,它通过包装另一个 List 实现不可修改的列表,并且与其他 List 一样实现了 List 接口。
  4. List 和 ArrayList 之间的关系符合组合模式:ArrayList 作为叶子节点实现了通用的 List 接口,而 UnmodifiableList 通过组合其他列表来扩展功能,形成了一个树形的结构。

3、小总结

组合模式在 JDK 中的应用主要体现在处理层次结构、递归结构的场景。AWT 中的 Component 和 Container 类,集合框架中的 List 接口及其实现,都采用了组合模式。通过这种设计,Java 提供了灵活而统一的接口,简化了对复杂对象结构的处理,同时保持了系统的可扩展性。

七、总结

组合模式(Composite Pattern)是一种结构型设计模式,适用于将对象组合成树形结构来表示“部分-整体”的层次关系。它允许用户像使用单个对象一样操作对象组合,简化了复杂结构的处理。组合模式的主要参与者包括抽象组件(Component),叶子节点(Leaf),和组合对象(Composite)。每个组件通过统一接口,支持递归处理子节点,使得系统更加灵活、易扩展。

以文件系统为例,文件夹可以包含文件或其他文件夹。在不使用组合模式时,文件和文件夹必须分别处理,导致代码复杂性增加且扩展性差。通过组合模式,可以使用统一的接口管理文件和文件夹,简化层次结构并增强系统的扩展性和灵活性。

组合模式在JDK源码中有广泛应用,如 java.awt 中的组件树(Component 和 Container 类),以及集合框架中的 List、ArrayList 和 Collections.unmodifiableList。这些类通过组合模式处理递归结构和对象组合,使得操作统一、灵活。

在这里,直接用 OpenAI o1草莓大模型

谷歌浏览器访问:https://www.nezhasoft.cn

👉 GPT功能:

  1. GPT-4o知识问答:支持1000+token上下文记忆功能
  2. 最强代码大模型Code Copilot:代码自动补全、代码优化建议、代码重构等
  3. DALL-E AI绘画:AI绘画 + 剪辑 = 自媒体新时代
  4. 私信哪吒,直接使用GPT-4o


🏆文章收录于:100天精通Java从入门到就业

哪吒数年工作总结之结晶。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

点击下方名片,回复1024,获取《10万字208道Java经典面试题总结(2024修订版).pdf 》

在这里插入图片描述

相关文章:

【结构型】树形结构的应用王者,组合模式

目录 一、组合模式1、组合模式是什么&#xff1f;2、组合模式的主要参与者&#xff1a; 二、优化案例&#xff1a;文件系统1、不使用组合模式2、通过组合模式优化上面代码优化点&#xff1a; 三、使用组合模式有哪些优势1、统一接口&#xff0c;简化客户端代码2、递归结构处理方…...

C++——求3*3矩阵对角元素之和。

没注释的源代码 #include <iostream> using namespace std; int main() { int a[3][3],i,j,sum0; cout<<"请输入a组中的元素:"<<endl; for(i0;i<2;i) { for(j0;j<2;j) { cin>>a[i][j]…...

nodejs基于vue电子产品商城销售网站的设计与实现 _bugfu

目录 技术栈具体实现截图系统设计思路技术可行性nodejs类核心代码部分展示可行性论证研究方法解决的思路Express框架介绍源码获取/联系我 技术栈 该系统将采用B/S结构模式&#xff0c;开发软件有很多种可以用&#xff0c;本次开发用到的软件是vscode&#xff0c;用到的数据库是…...

GO Ants 学习

文章目录 主要特性安装基本用法1. 创建协程池并提交任务2. 带返回值的任务提交3. 自定义协程池的参数4. 获取协程池状态 应用场景优势资源释放性能对比总结 ants 是一个高性能的 Go 语言协程池库&#xff0c;专注于有效地管理 Go 协程的数量。它通过复用协程减少了创建和销毁协…...

Scikit-learn (`sklearn`) 教程

Scikit-learn (sklearn) 教程 Scikit-learn 是 Python 中最流行的机器学习库之一&#xff0c;提供了丰富的机器学习算法、数据预处理工具以及模型评估方法&#xff0c;广泛应用于分类、回归、聚类和降维等任务。 在本教程中&#xff0c;我们将介绍如何使用 Scikit-learn 进行…...

【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构

唯有梦想才配让你不安&#xff0c; 唯有行动才能解除你的不安。 --- 卢思浩 --- 从零开始掌握序列化 1 知识回顾2 序列化与编写协议2.1 使用Json进行序列化2.2 编写协议 3 封装IOService4 应用层 --- 网络计算器5 总结 1 知识回顾 上一篇文章我们讲解了协议的本质是双方能够…...

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…...

django+vue

1. diango 只能加载静态js&#xff0c;和flask一样 2. 关于如何利用vue创建web&#xff0c;请查看flask vue-CSDN博客 3. 安装django pip install django 4. 创建新项目 django-admin startproject myproject 5.django 中可以包含多个app 5.1 创建一个app cd myprojec…...

HCIA--实验十七:EASY IP的NAT实现

一、实验内容 1.需求/要求&#xff1a; 通过一台PC&#xff0c;一台交换机&#xff0c;两台路由器来成功实现内网访问外网。理解NAT的转换机制。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.PC1配置ip地址及网关&#xff1a; 2.AR1接口配置ip地址&#xff1…...

彻底解决:QSqlDatabase: QMYSQL driver not loaded

具体错误 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMIMER QMARIADB QMYSQL QODBC QPSQL 检查驱动 根据不同安装目录而不同&#xff1a; D:\Qt\6.7.2\mingw_64\plugins\sqldrivers 编译驱动 如果没有&#xff0c;需要自行编译&…...

leetcode02——59. 螺旋矩阵 II、203. 移除链表元素

59. 螺旋矩阵 II class Solution {public int[][] generateMatrix(int n) {int[][] nums new int[n][n]; // 定义二维数组用于存储数据int startX 0; // 定义每循环一个圈的起始位置int startY 0;int loop 1; // 定义圈数&#xff0c;最少1圈int count 1; // 用来给矩阵中…...

Matlab Simulink 主时间步(major time step)、子时间步(minor time step)

高亮颜色说明&#xff1a;突出重点 个人觉得&#xff0c;&#xff1a;待核准个人观点是否有误 高亮颜色超链接 文章目录 对Simulink 时间步的理解Simulink 采样时间的类型Discrete Sample Times(离散采样时间)Controllable Sample Time(可控采样时间) Continuous Sample Times(…...

docker 升级步骤

Docker 升级的步骤通常取决于你所使用的操作系统。以下是针对常见操作系统&#xff08;如 Ubuntu 和 CentOS&#xff09;的 Docker 升级步骤&#xff1a; Ubuntu 更新现有的包索引&#xff1a; sudo apt-get update 升级 Docker&#xff1a; 您可以运行以下命令来升级 Docker…...

828华为云征文 | 云服务器Flexus X实例:one-api 部署,支持众多大模型

目录 一、one-api 介绍 二、部署 one-api 2.1 拉取镜像 2.2 部署 one-api 三、运行 one-api 3.1 添加规则 3.2 运行 one-api 四、添加大模型 API 4.1 添加大模型 API 五、总结 本文通过 Flexus云服务器X实例 部署 one-api。Flexus云服务器X实例是新一代面向中小企业…...

2024 SNERT 预备队招新 CTF 体验赛-Web

目录 1、robots 2、NOF12 3、get_post 4、好事慢磨 5、uploads 6、rce 7、ezsql 8、RCE 1、robots robots 协议又叫爬虫协议&#xff0c;访问 robots.txt 继续访问 /JAY.php 拿到 flag&#xff1a;flag{hello_Do_YOU_KONw_JAY!} 2、NOF12 F12 和右键都被禁用 方法&#…...

亲测全网10大“免费”论文降重神器!论文写作必备!

在当今学术研究和论文写作中&#xff0c;AI技术的应用已经变得越来越普遍。为了帮助学者们更高效地完成论文撰写任务&#xff0c;以下将详细介绍十款必备的论文写作工具&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和…...

二分算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 本章我们来学习的是二分查找算法&#xff0c;二分算法的应用非常广泛&#xff0c;不仅限于数组查找&#xff0c;还可以用于解决各种搜索问题、查找极值问题等。在数据结构和算…...

Kafka 的基本概念

一、Kafka 主要用来做什么 作为消息系统&#xff1a;Kafka 具备系统解藕&#xff0c;流量削峰&#xff0c;缓冲&#xff0c;异步通信&#xff0c;扩展性&#xff0c;可恢复性等功能&#xff0c;以及消息顺序性保障和回溯消费 作为存储系统&#xff1a;Kafka 把消息持久化到磁…...

《粮油与饲料科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《粮油与饲料科技》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定 学术期刊。 问&#xff1a;《粮油与饲料科技》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;中文天地出版传媒集团股份有限公司…...

Python之一些列表的练习题

1.比较和对比字符串、列表和元组。例如&#xff0c;它们可以容纳哪类内容以及在数据结构上可以做哪些操作。 1. 内容类型:- 字符串: 只能包含字符(文本)。- 列表: 可以包含任意类型的数据,如数字、字符串、其他列表等。- 元组: 可以包含任意类型的数据,与列表类似。3. 操作:(1…...

MoFA: 迈向AIOS

再一次向朋友们致以中秋的祝福&#xff01; MoFA (Modular Framework for Agents)是一个独特的模块化AI智能体框架。MoFA以组合&#xff08;Composition)的逻辑和编程&#xff08;Programmable&#xff09;的方法构建AI智能体。开发者通过模版的继承、编程、定制智能体&#xf…...

c语言中define使用方法

在C语言中&#xff0c;#define指令是预处理指令&#xff0c;用于定义宏。其常用格式是&#xff1a; 定义常量&#xff1a; #define 常量名 常量值 例子&#xff1a; #define PI 3.14159 #define MAX_SIZE 100 这里&#xff0c;PI和MAX_SIZE在代码中会被替换为其对应的值。没有…...

尚品汇-秒杀商品定时任务存入缓存、Redis发布订阅实现状态位(五十一)

目录&#xff1a; &#xff08;1&#xff09;秒杀业务分析 &#xff08;2&#xff09;搭建秒杀模块 &#xff08;3&#xff09;秒杀商品导入缓存 &#xff08;4&#xff09;redis发布与订阅实现 &#xff08;1&#xff09;秒杀业务分析 需求分析 所谓“秒杀”&#xff0…...

第十一章 【后端】商品分类管理微服务(11.4)——spring-boot-devtools

11.4 spring-boot-devtools 官网:https://docs.spring.io/spring-boot/reference/using/devtools.html Spring Boot DevTools 是 Spring Boot 提供的一组易于使用的工具,旨在加速开发和测试过程。它通过提供一系列实用的功能,如自动重启、实时属性更新、依赖项的热替换等,…...

MySQL篇(索引)(持续更新迭代)

目录 一、简介 二、有无索引情况 1. 无索引情况 2. 有索引情况 3. 优劣势 三、索引结构 1. 简介 2. 存储引擎对于索引结构的支持情况 3. 为什么InnoDB默认的索引结构是Btree而不是其它树 3.1. 二叉树&#xff08;BinaryTree&#xff09; 3.2. 红黑树&#xff08;RB&a…...

通用接口开放平台设计与实现——(31)API服务线程安全问题确认与修复

背景 在本系列的前面一篇博客评论中&#xff0c;有小伙伴指出&#xff0c;API服务存在线程安全问题&#xff1a; https://blog.csdn.net/seawaving/article/details/122905199#comments_34477405 今天来确认下&#xff0c;线程是否安全&#xff1f;如不安全&#xff0c;如何…...

2011-2022年数字金融与企业ESG表现:效应、机制与“漂绿”检验(内含原始数据+处理代码)

2011-2022年数字金融与企业ESG表现&#xff1a;效应、机制与“漂绿”检验&#xff08;内含原始数据处理代码&#xff09; 1、时间&#xff1a;2011-2022年 2、来源&#xff1a;上市公司年报、华证ESG、北大数字普惠金融 3、指标&#xff1a;年份、股票代码、股票简称、行业名…...

mysql配置相关命令

一、允许所有人访问&#xff1a; -- 1.切换至mysql库 use mysql;-- 2.查看用户表 SELECT Host,User FROM user;-- 3.修改字段 UPDATE user SET Host % WHERE User root;-- 4.刷新权限 flush privileges;二、修改加密方式 -- 1.切换至mysql库 use mysql;-- 2.查看用户表 SELEC…...

【自用软件】IDM下载器 Internet Download Manager v6.42 Build 10

下载IDM&pj安装教程 Internet Download Manager&#xff0c;简称 IDM&#xff0c;是国外的一款优秀下载工具。目前凭借着下载计算的速度优势在外媒网站中均受好评&#xff0c;现在已被多数国人熟知。Internet Download Manager 提升你的下载速度最多达5倍&#xff0c;安排下…...

Kafka集群扩容(新增一台kafka节点)

kafka集群扩容、kafka topic迁移 现有环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3 扩容之后环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3192.168.17.54ka…...