设计模式:生活中的组合模式
想象一下,你正在组织一个大型的家庭聚会。在这个聚会中,你需要准备各种菜肴,每个菜肴又包含不同的食材。你的目标是能够以统一的方式处理整个聚会的准备工作,不论是处理单个食材还是一整道菜肴。
在这个场景中,我们可以将“菜肴”看作是组合对象,“食材”看作是叶子节点。整个家庭聚会的准备工作就是一个“部分-整体”的层次结构,与组合模式中的结构类似。
家庭聚会的组合模式类比
- 整体(Composite):整个聚会的菜单,包含了多个菜肴,每个菜肴又可以包含其他菜肴或者单独的食材。
- 部分(Leaf):单个食材,如西红柿、黄瓜等,不再包含其他食材。
- 共同接口(Component):菜肴和食材都可以通过某些共同的操作来处理,例如“准备”或“展示”。
实际例子
假设你需要准备以下菜肴:
- 沙拉(Composite):包含西红柿(Leaf)、黄瓜(Leaf)和生菜(Leaf)。
- 烤肉(Composite):包含牛肉(Leaf)和调料(Composite),调料又包含盐(Leaf)和黑胡椒(Leaf)。
这里,沙拉和烤肉都是可以由更小部分组成的复合菜肴,而西红柿、黄瓜、生菜、牛肉、盐和黑胡椒都是基本的食材,没有进一步的分解。
在准备这个聚会时,你不必关心每个菜肴的具体组成。你可能会有一个统一的流程来“准备”每个菜肴,无论它是一个复合菜肴还是一个单一食材。这就是组合模式的精髓:客户端代码可以忽略对象之间的复杂层次差异,统一对待所有对象。
代码实现类比
如果我们要将这个场景转换成代码,可能如下:
// 共同接口
interface PartyItem {void prepare();
}// 叶子节点
class Ingredient implements PartyItem {private String name;public Ingredient(String name) {this.name = name;}@Overridepublic void prepare() {System.out.println("Preparing " + name);}
}// 组合对象
class Dish implements PartyItem {private String name;private List<PartyItem> ingredients = new ArrayList<>();public Dish(String name) {this.name = name;}public void add(PartyItem item) {ingredients.add(item);}@Overridepublic void prepare() {System.out.println("Preparing dish: " + name);for (PartyItem item : ingredients) {item.prepare();}}
}
在上述代码中,Dish 可以包含其他 Dish 对象或 Ingredient 对象,而 Ingredient 是基本的食材。prepare 方法为统一的操作,既可以准备单个食材,也可以准备整个菜肴。
总结
通过这个日常生活中的类比,我们可以看到组合模式如何在软件设计中发挥作用。它允许我们以统一的方式操作单个对象和组合对象,简化了客户端代码,并使得整个结构更加灵活。在设计系统时,考虑到部分-整体的关系,可以帮助我们更好地应用组合模式。
相关文章:
设计模式:生活中的组合模式
想象一下,你正在组织一个大型的家庭聚会。在这个聚会中,你需要准备各种菜肴,每个菜肴又包含不同的食材。你的目标是能够以统一的方式处理整个聚会的准备工作,不论是处理单个食材还是一整道菜肴。 在这个场景中,我们可…...
WPF OnStartup
在Windows Presentation Foundation (WPF)框架中,OnStartup 是 System.Windows.Application 类的一个受保护的虚方法,它是应用程序启动过程中的一个重要环节。当一个 WPF 应用程序启动时,其入口点通常是 App.xaml 文件和对应的后台代码文件 A…...
docker-相关
打镜像 1、编写dockfile文件,请自行百度 2、docker build -t 镜像名称:版本号 dockerFile路径 3、docker save -o 镜像压缩包名称.tar 镜像名称:镜像版本号 部署镜像 1、将镜像tar包放到部署机器上 2、加载镜像:docker load -i 镜像tar包路径 3、dock…...
二十、Rust AOP 切面增强
用过 java spring 的同学,应该会对 AspectJ 的 前置、后置、环绕 增强 念念不忘,巧了 rust 也有类似能力,稍显不同的是,为了向 “零成本抽象” 靠齐,Rust 的 “增强” 是在编译期 完成的。 编译期生成,则离…...
掌握Go语言:Go语言精细错误,清晰、高效的错误处理实践(32)
错误处理是任何编程语言中都至关重要的一部分,Go 语言提供了一套简单而强大的错误处理机制,使得处理错误变得高效而清晰。 Go 错误类型 在 Go 中,错误是一个普通的接口类型,即 error 接口,其定义如下: t…...
Spring与Web环境的集成
1. ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) ,这样的弊端是配置文件加载多…...
二叉树的遍历——bfs广度优先搜索
1、BinNode类的创建 (1)代码总览 ##(2)测试示例 2、二叉树的遍历 (1)图示 (2)代码总览 (3)测试示例...
飞鸟写作可靠吗 #职场发展#经验分享#经验分享
飞鸟写作是一个非常便捷的论文写作工具,不仅可以帮助用户高效地完成论文写作,还可以提供查重降重的功能,帮助用户确保论文的原创性。那么,飞鸟写作到底可靠吗?答案是肯定的。 首先,飞鸟写作提供的查重降重功…...
Java 实现自定义注解
一、interface 关键字 我们想定义一个自己的注解 需要使用 interface 关键字来定义。 如定义一个叫 MyAnnotation 的注解: public interface MyAnnotation { } 二、元注解 光加上 interface 关键字 还不够,我们还需要了解5大元注解 RetentionTargetDo…...
代码随想录Day48
Day 48 动态规划part09 今日任务 198.打家劫舍213.打家劫舍II337.打家劫舍III 代码实现 基础打家劫舍 class Solution {public static int rob(int[] nums) {if (nums null || nums.length 0) return 0;if (nums.length 1) return nums[0];int[] dp new int[nums.leng…...
Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus
Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus 做一个后台管理项目,里面需要用到权限管理。这里说一下权限定义的大概,代码不多,主要讲原理和如何实现它。 一、权限管理的原理 权限…...
ADB 操作命令及其详细用法
adb devices 用途:列出连接到计算机的所有 Android 设备。详解:执行该命令后,ADB 将扫描连接到计算机的所有 Android 设备,并列出它们的序列号。 adb connect <device> 用途:连接到指定 IP 地址的 Android 设备。…...
类的函数成员(三):拷贝构造函数
一.什么是拷贝构造函数? 1.1 概念 同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。 在建立对象…...
C#操作MySQL从入门到精通(8)——对查询数据进行高级过滤
前言 我们在查询数据库中数据的时候,有时候需要剔除一些我们不想要的数据,这时候就需要对数据进行过滤,比如学生信息中,我只需要年龄等于18的,同时又要家乡地址是安徽的,类似这种操作专栏第7篇的C#操作MySQL从入门到精通(7)——对查询数据进行简单过滤简单过滤方法就无法…...
Centos 7 安装通过yum安装google浏览器
在CentOS 7上使用yum安装Google Chrome浏览器稍微复杂一些,因为Chrome并不直接包含在默认的Yum仓库中。按照以下步骤来操作: 1、添加Google Chrome仓库 首先,您需要手动添加Google Chrome的Yum仓库。打开终端,并使用文本编辑器&a…...
题目:学习使用按位与 。
题目:学习使用按位与 & 。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated shoul…...
逐步分解,一文教会你如何用 jenkins+docker 实现主从模式
jenkins 主从模式想必大家都不陌生,大家在学习过程中为了学习方便都在自己本地搭建了 jenkins 环境,然后通过 javaweb 方式实现,对于 docker 下实现主从模式大家好像兴趣挺大。 今天就通过这篇文章给大家讲讲怎么玩,希望对大家有…...
WebSocket 对于手游的意义
WebSocket作为一个HTTP的升级协议,其实对HTTP协议用的不多,主要是消息头相关部分,WebScoket协议最初的动机应该是给网页应用增加一个更贴近实时环境的通讯方式,让某些网页应用得到更佳的通讯质量(双工,低延…...
安卓APP的技术质量:如何提高
安卓APP的技术质量:如何提高 技术质量包括稳定性和性能,还有资源工具化程序.你的APP 的技术质量能够影响你的用户体验.一个高质量的体验不仅 最小化了技术问题的存在,而且也最大化地利用了安卓操作 系统和设备硬件的能力. 为了构建一个高质量的APP,遵循如下的指导原则: 形式因…...
二分查找 -- 力扣(LeetCode)第704题
题目 https://leetcode.cn/problems/binary-search/description/ 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例…...
破局与重塑:大模型浪潮下机器学习工程师的生存指南
十字路口的困惑与机遇当大语言模型(LLM)与生成式AI(GenAI)以前所未有的速度席卷全球,身处技术浪潮中心的机器学习工程师们,正经历着一场深刻的职业震荡。曾经引以为傲的XGBoost、卷积神经网络(C…...
HRS广濑电机(HIROSE)推出 AU1 系列获电动车行业顶级制造商采用
HRS广濑电机AU1系列获电动车行业顶级制造商采用作为车载USB Type-C标准化的引领者加速推动下一代车辆的设计进程广濑电机(Hirose Electric)的AU1系列成为连接器行业中首个获大型电动车制造商采纳为其车载USB Type-C接口规格的解决方案。借此契机,我司将与该OEM厂商携…...
企业级AI智能体平台技术评测:9款产品架构差异与生产落地能力分析
现在,大模型已经从“会聊天”进化到了“会干活”,AI智能体(AI Agent)成为这场变革的核心载体。麦肯锡数据显示,2025年已有62%的组织开展AI智能体相关实践,64%的企业认为AI提升了组织创新能力,其…...
[源码开源] 被抄袭后我选择把 3w 用户日活千人的小游戏源码直接公开
小红书上最火的猜数字微信小程序游戏「谁输谁洗碗」开源啦,上线一个月累计注册用户超 3w ,支持双人对战的猜谜游戏,包含猜数字、猜颜色、每日挑战和残局解谜等多种游戏模式。 最近真的忙,辛苦做的游戏被人直接 1:1 照搬ÿ…...
星闪实战指南:10分钟掌握WS63 SDK任务调度与调试技巧
1. 星闪WS63 SDK任务调度基础 第一次接触星闪WS63 SDK的任务调度功能时,我完全被各种API搞晕了。经过几个项目的实战,才发现这套任务管理系统设计得非常巧妙。简单来说,它就像个智能管家,能帮你把各种工作安排得井井有条。 任务调…...
7个技巧构建Telegraf高可用监控系统:从单点到企业级架构
7个技巧构建Telegraf高可用监控系统:从单点到企业级架构 你是否遇到过监控数据丢失、告警延迟或Agent单点故障?作为插件驱动的服务器代理(Plugin-driven server agent),Telegraf在企业级监控中扮演关键角色࿰…...
Laravel Stats Tracker与Google Analytics对比分析:自建统计系统的优势
Laravel Stats Tracker与Google Analytics对比分析:自建统计系统的优势 【免费下载链接】tracker Laravel Stats Tracker 项目地址: https://gitcode.com/gh_mirrors/tr/tracker 在网站分析和用户行为跟踪领域,Google Analytics无疑是业界标杆&am…...
CPU与操作系统【简单的认识理解】
在日常开发过程中,我们都是正常写完代码去执行即可,不用了解计算机运行的底层逻辑。但是了解计算机运行的底层逻辑,对于我们以后理解撰写代码以及理解错误原理有着重要地位,因此,我们特意写上一篇文章跟大家介绍。在计…...
移动端ncnn部署YOLOv11:从官方转换到实战排错
1. 移动端部署YOLOv11的完整流程 在移动端部署YOLOv11模型,ncnn无疑是最佳选择之一。这个轻量级的高性能神经网络前向计算框架,专为移动端优化设计。我最近刚完成一个项目,需要把YOLOv11部署到安卓设备上,整个过程虽然踩了不少坑…...
你的Bootloader安全吗?给STM32F103的Ymodem升级加上AES加密和CRC32校验(附完整代码)
STM32F103 Bootloader安全加固实战:AES加密与CRC32校验的Ymodem升级方案 在物联网设备快速普及的今天,固件升级已成为设备维护的常规操作。然而,传统Ymodem协议在传输安全性方面的不足,使得固件在传输过程中面临被窃取或篡改的风险…...
