探索组合模式:构建灵活的层次结构

news2024/9/24 15:46:49

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户可以以一致的方式处理单个对象和组合对象。

一,组合模式的结构

组合模式主要包含以下几个部分:

  • 组件(Component):定义了组合对象和单个对象的接口。
  • 叶子(Leaf):表示组合中的叶节点对象,叶节点没有子节点。
  • 组合(Composite):表示有子节点的对象,定义了子节点的行为。

uml类图:
在这里插入图片描述

二,示例代码

下面是一个简单的组合模式的示例代码:

import java.util.ArrayList;
import java.util.List;

// 组件接口
interface Component {
    void operation();
}

// 叶子节点
class Leaf implements Component {
    private String name;

    Leaf(String name) {
        this.name = name;
    }

    @Override
    public void operation() {
        System.out.println("Leaf " + name + " operation");
    }
}

// 组合节点
class Composite implements Component {
    private List<Component> children = new ArrayList<>();

    @Override
    public void operation() {
        for (Component child : children) {
            child.operation();
        }
    }

    public void add(Component component) {
        children.add(component);
    }

    public void remove(Component component) {
        children.remove(component);
    }

    public Component getChild(int index) {
        return children.get(index);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Composite root = new Composite();
        Composite branch1 = new Composite();
        Composite branch2 = new Composite();

        Leaf leaf1 = new Leaf("1");
        Leaf leaf2 = new Leaf("2");
        Leaf leaf3 = new Leaf("3");

        root.add(branch1);
        root.add(branch2);
        branch1.add(leaf1);
        branch1.add(leaf2);
        branch2.add(leaf3);

        root.operation();
    }
}

三,工作原理

  1. 定义组件接口: 定义一个统一的接口,所有的叶子和组合对象都实现该接口。
  2. 实现叶子节点: 叶子节点实现组件接口,表示最基本的对象。
  3. 实现组合节点: 组合节点实现组件接口,并持有子节点的集合,可以添加、移除和获取子节点。
  4. 客户端代码统一处理: 客户端代码通过组件接口处理叶子和组合对象,无需关心它们的具体类型。

四,优点

  1. 简化客户端代码: 客户端可以一致地处理组合对象和单个对象。
  2. 更容易扩展: 可以很方便地增加新的叶子或组合类。

五,缺点

  1. 可能导致系统过于复杂: 如果层次结构过深,可能会导致系统复杂性增加。
  2. 不容易限制组合中的组件类型: 在某些情况下,可能需要额外的类型检查。

六,适用场景

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

  1. 需要表示对象的部分-整体层次结构:例如文件系统中的文件和文件夹。
  2. 希望客户统一处理单个对象和组合对象:客户代码可以忽略对象组合和单个对象的差异。

七,现实案例

  1. 文件系统: 文件夹可以包含文件或其他文件夹,文件是叶子节点,文件夹是组合节点。
  2. 图形界面: 窗口可以包含按钮、文本框等,按钮和文本框是叶子节点,窗口是组合节点。

八,总结

组合模式是一种强大的设计模式,它允许你以树形结构组织对象,使得客户代码可以一致地处理单个对象和组合对象。通过合理使用组合模式,可以提高系统的灵活性和可扩展性。


如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!

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

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

相关文章

Java练习-----时间工具类(JDK8之后)

目录 LocalDate/LocalTime/LocalDateTime类 ZoneDateTime和ZoneId Instant类 DateTimeFormatter类 &#xff1a;解析格式化时间 LocalDate/LocalTime/LocalDateTime类 package crrc.studytest1;import java.time.Duration; import java.time.LocalDateTime;public class Du…

虚拟机屏幕分辨率自适应VMWare窗口大小

文章目录 环境问题解决办法其它虚拟机和主机间复制粘贴 参考 环境 Windows 11 家庭中文版VMWare Workstation 17 ProUbuntu 24.04.1 问题 虚拟机的屏幕大小&#xff0c;是固定的。如下图&#xff0c;设置的分辨率是800*600&#xff0c;效果如下&#xff1a; 可见&#xff0c…

统信服务器操作系统ade版【iostat】命令详解

统信服务器操作系统全版本iostat 安装、命令格式和命令参数 文章目录 功能概述功能介绍1.iostat安装2.iostat命令格式3.iostat命令参数 功能概述 iostat主要用与报告CPU统计信息和设备分区的io统计信息&#xff0c;iostat首次运行时显示自系统启动开始的各项统计信息&#xff…

1.5 计算机网络的分层结构

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言1 分层设计2 网络体系结构2.1 基本概述2.2 常见的三种网络体系结构 3 各层之间的关系3.1 水平关系3.2 垂直关系 4 数据传输过程4.1 水平视角4.2 垂直视角 前言 在当今数字…

Ubuntu22.04安装GNSS数据处理软件GAMIT/GLOBK

由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~ 手把手带您安装gamit/globk软件~ &#x1f33f;前言 受朋友之托&#xff0c;出一期Ubuntu22.04安装GNSS数据处理软件——gamit软件…

Web端云剪辑解决方案,智能字幕,精准识别语音字幕,一键上轨编辑

无论是企业宣传、个人Vlog、在线教育还是直播带货&#xff0c;高质量的视频内容都是吸引眼球、传递价值的关键。然而&#xff0c;面对繁琐的剪辑流程、高昂的时间成本以及技术门槛&#xff0c;许多创作者往往望而却步。正是洞察到这一市场需求&#xff0c;美摄科技携其创新的We…

解锁MySQL升级秘诀:提升性能、增强安全的必备指南

随着mysql不断演进&#xff0c;旧的版本不断地会发现新的漏洞&#xff0c;为修复漏洞体验新版本的功能&#xff0c;就需要对数据库进行升级操作。 升级注意点 备份&#xff01;备份&#xff01;备份&#xff01; 1.从5.6升级到5.7需首先升级到5.6最新版&#xff1b;不支持跨…

消息中间件常见面试题(RabbitMQ)

MQ场景&#xff1a; 异步发送&#xff08;验证码、短信、邮件&#xff09;MySQL、Redis、ES之间的数据同步分布式事务等 一、RabbitMQ 1.1 消息不丢失 提问&#xff1a;如果保证消息不丢失呢&#xff1f; 流程&#xff1a;生产者将消息发送给交换机&#xff0c;交换机发送给…

css实现类似歌词字体渐变的效果

1、HTML <view class"title">哈哈哈哈哈</view> 2、CSS animation: hue 6s infinite linear;background-image: linear-gradient(135deg, #fc00c7 0%, #1c4efd 54%, #00aded 100%);-webkit-text-fill-color: transparent;color: transparent;-webkit-ba…

【**倒计时,人工智能的ASI时代几年内将至-samaltman深夜发文预言**】

在未来的几十年里&#xff0c;我们将能够做到我们的祖辈认为像魔术一样的事情。 这是Sama Ltman博文的第一句话。技术进步加速&#xff1a;随着时间的推移&#xff0c;人类的能力显著提高&#xff0c;我们能够完成前人认为不可能的事情。他认为&#xff1a; 我们的能力增强不…

Spring 核心

Spring 核心 这篇文章&#xff0c;我们换个思路来学习&#xff0c;来践行一下以始为终&#xff0c;以面试题为引来重温一下Spring&#xff0c;毕竟孔子曾说&#xff0c;“温故而知新&#xff0c;可以为师矣。” &#xff0c;可以通过这个链接看看有哪些常见的面试题 Spring 面…

【深度学习】03-神经网络2-1损失函数

在神经网络中&#xff0c;不同任务类型&#xff08;如多分类、二分类、回归&#xff09;需要使用不同的损失函数来衡量模型预测和真实值之间的差异。选择合适的损失函数对于模型的性能至关重要。 这里的是API 的注意⚠️&#xff0c;但是在真实的公式中&#xff0c;目标值一定是…

第二证券:a股创业板科创板是什么意思?各自代码是什么?

a股创业板科创板是什么意思&#xff1f; a股是指人民币一般股票的总称&#xff0c;其发行公司是在我国境内注册的&#xff0c;a股在境内发行并以人民币计价&#xff0c;a股的投资者首要是境内安排、安排或个人&#xff0c;也包括合格的境外安排投资者。 创业板是股票商场的一…

睡眠监测系统基于边缘计算和微服务缓存

这篇论文的主要内容是关于基于边缘计算和微服务缓存的睡眠监测系统。以下是详细内容概述&#xff1a; 标题 睡眠监测系统基于边缘计算和微服务缓存 作者 Nico Surantha - 东京市立大学&#xff0c;日本David Jayaatmaja - 雅加达Bina Nusantara大学&#xff0c;印度尼西亚S…

项目管理软件应具备哪些功能?分享一款功能齐全的项目管理工具

项目管理软件是一类专门设计用于规划、执行和监控项目的工具。它提供了一种集中管理和协调项目活动的方式&#xff0c;有助于提升项目的效率和成功率。本文将介绍项目管理软件的九大基本功能是什么&#xff0c;以及分享一款功能齐全的项目管理软件供大家参考。 一、项目计划与…

CANopen开源库canfestival的移植

本文记录将CANopen开源库CANfestival移植到GD32F470单片机的过程。CANopen协议理解请参考博客&#xff1a;CANopen协议的理解-CSDN博客 CANfestival开源库下载链接 CSDN链接&#xff1a; https://download.csdn.net/download/heqiunong/89774627 官网链接&#xff1a;https:/…

2024年主动降噪头戴式耳机该如何选择?四款品牌高性价比推荐

今天与大家聊一聊头戴式降噪蓝牙耳机。无论是沉浸在游戏的世界中&#xff0c;还是专注于观看视频课程汲取知识&#xff0c;它都能为我带来清晰、震撼的音质体验。对程序员来说&#xff0c;在嘈杂的工作环境中&#xff08;比如机房里&#xff09;&#xff0c;头戴式耳机都能让我…

Linux shell编程学习笔记83:time命令——争分夺秒

0 引言 在DOS或Windows中&#xff0c;我们可以使用time命令来查看或修改系统时间。 但是在Linux中&#xff0c;time命令的功能却与DOS或Windows迥然不同。 1 time命令 的功能、帮助信息、命令格式和参数说明 1.1 time命令 的功能 在Linux&#xff0c;time命令的功能是测量…

鸿蒙 OS 开发单词打卡 APP 项目实战 20240922 笔记和源码分享

配套有完整的录播课, 需要的私信. 零基础入门级别, 有点前端基础都能学会. 效果截图: 代码截图: 页面完整代码: import { AnswerStatus } from ../enums/AnswerStatus import { PracticeStatus } from ../enums/PracticeStatus import { getRandomQuestions, Question …

江协科技STM32学习- P17 TIM输入捕获

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…