【设计模式】组合模式

news/2025/2/11 23:10:13/

目录

什么是组合模式

代码实现


什么是组合模式

Java中的组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得客户端对单个对象和组合对象的处理具有一致性,因为它们都遵循相同的接口。

组合模式中,有两种类型的对象:

  1. 叶子节点(Leaf):表示树中的最终对象,它没有子节点。叶子节点通常是最小的组成单元,它们不再包含其他对象。

  2. 组合节点(Composite):表示包含子节点的对象。组合节点通常包含一个或多个子节点,它们实现了与叶子节点相同的接口,因此客户端可以对单个对象和组合对象进行统一的处理。

组合模式的核心思想是将单个对象和组合对象视为具有相同接口的对象。这样,客户端无需关心正在处理的对象是单个对象还是组合对象,而可以将它们一视同仁地处理。

组合模式通常包含以下角色:

  • 组件(Component):定义了组合模式的接口,包含了叶子节点和组合节点的公共操作方法。在Java中通常是一个接口或抽象类。

  • 叶子节点(Leaf):实现了组件接口,表示树中的最终对象,它没有子节点。

  • 组合节点(Composite):实现了组件接口,并包含了一个或多个子节点。组合节点可以添加、删除和获取子节点,并实现了对子节点的统一操作。

组合模式的主要优点包括:

  • 统一接口组合模式使得客户端对单个对象和组合对象的处理具有一致性,因为它们都遵循相同的接口。

  • 灵活性组合模式使得可以轻松地添加、删除和组合对象,而无需更改客户端代码。

  • 可扩展性:由于组合模式中的组件具有相同的接口,因此可以轻松地扩展新的组件类型。

组合模式适用于以下情况:

  • 当需要表示部分-整体的层次结构时,可以使用组合模式

  • 当希望客户端对单个对象和组合对象具有一致性的处理时,可以使用组合模式

总之,组合模式是一种非常有用的设计模式,它使得可以轻松地表示和处理具有层次结构的对象,并使客户端代码更加简洁和灵活。

下面我们使用java代码实现一个组合模式的案例,走你~~~~

代码实现

下面是一个简单的Java代码示例,演示了如何使用组合模式

import java.util.ArrayList;
import java.util.List;// 组件接口
interface Component {void operation();
}// 叶子节点
class Leaf implements Component {private String name;public Leaf(String name) {this.name = name;}@Overridepublic void operation() {System.out.println("Leaf " + name + ": operation");}
}// 组合节点
class Composite implements Component {private List<Component> children = new ArrayList<>();public void add(Component component) {children.add(component);}public void remove(Component component) {children.remove(component);}@Overridepublic void operation() {System.out.println("Composite: operation");for (Component component : children) {component.operation();}}
}// 客户端
public class CompositePatternExample {public static void main(String[] args) {// 创建叶子节点Leaf leaf1 = new Leaf("A");Leaf leaf2 = new Leaf("B");Leaf leaf3 = new Leaf("C");// 创建组合节点Composite composite1 = new Composite();Composite composite2 = new Composite();// 将叶子节点添加到组合节点中composite1.add(leaf1);composite1.add(leaf2);composite2.add(leaf3);// 将组合节点添加到另一个组合节点中Composite composite = new Composite();composite.add(composite1);composite.add(composite2);// 客户端操作组合节点composite.operation();}
}

        在这个示例中,Component是组件接口,定义了组合模式的操作方法。Leaf是叶子节点类,实现了Component接口,并表示树中的最终对象。Composite是组合节点类,实现了Component接口,并包含了一个或多个子节点。

        在客户端代码中,我们创建了几个叶子节点和组合节点,并将它们组合成一个树形结构。然后,我们调用根节点的operation方法,从而触发整个树形结构的操作。通过组合模式,我们可以将单个对象和组合对象一视同仁地进行处理。

        非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~


http://www.ppmy.cn/news/1427551.html

相关文章

python-selenium +Chrome driver环境配置

selenium Chrome driver环境配置_chromedriver 122.0.6261.112-CSDN博客

移植speexdsp到OpenHarmony标准系统②

在linux上生成speexdsp的so动态链接库和.a静态链接库 make和make install后会生成speexdsp的.so动态链接库和.a静态链接库 make make install其中build/lib目录下&#xff1a; ├── libspeexdsp.a /*静态库*/ ├── libspeexdsp.la …

Kafka入门介绍+集群部署+简单使用

Kafka入门介绍集群部署简单使用 简介核心概念Broker&#xff08;服务节点/实例&#xff09;Producer&#xff08;生产者&#xff09;Topic&#xff08;主题&#xff09;Partition&#xff08;分区&#xff09;Consumer&#xff08;消费者&#xff09;和Consumer Group&#xff…

c#多线程 使用lock锁

使用 lock 关键字可以确保在同一时刻只有一个线程可以访问被锁定的代码块&#xff0c;从而避免线程资源竞争。以下是修改后的示例代码&#xff1a; using System; using System.Threading;class Program {static int sharedNumber 0;static int iterations 1000000;static o…

URL地址解析至页面展示全过程(面试详细解答)

目录 1、解析URL 2、缓存判断 ​编辑3、DNS解析 ​编辑4、获取MAC地址 5、TCP三次握手 6、HTTP请求 7、服务器处理请求&#xff0c;返回HTTP响应 8、页面渲染 9、TCP四次挥手 10、浏览器解析HTML 11、浏览器布局渲染 1、解析URL 首先会对 URL 进行解析&#xff0c;…

html5与css3前端学习笔记

一、前端页面开发流程 创建页面项目目录使用Photoshop对效果图切图&#xff0c;切出网页制作中需要的小图片将装饰类图像合并&#xff0c;制作成雪碧图结合Photoshop和代码编辑器&#xff0c;参照效果图&#xff0c;进行html和css代码书写&#xff0c;制作页面 二、CSS权重 …

react 项目路由配置(react-router-dom 版本 v6.3、v6.4)

根据 react-router-dom 的版本&#xff0c;有不同的方式 一、react-router-dom v6.3 用到的主要 api: BrowserRouteruseRoutesOutlet 下面是详细步骤&#xff1a; 1、index.js BrowserRouter 用来实现 单页的客户端路由使用 BrowserRouter 包裹 App放在 顶级 位置&#x…

Golang | Leetcode Golang题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; func firstMissingPositive(nums []int) int {n : len(nums)for i : 0; i < n; i {for nums[i] > 0 && nums[i] < n && nums[nums[i]-1] ! nums[i] {nums[nums[i]-1], nums[i] nums[i], nums[nums[i]-1]}}for i …