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

设计模式:生活中的组合模式

想象一下,你正在组织一个大型的家庭聚会。在这个聚会中,你需要准备各种菜肴,每个菜肴又包含不同的食材。你的目标是能够以统一的方式处理整个聚会的准备工作,不论是处理单个食材还是一整道菜肴。

在这个场景中,我们可以将“菜肴”看作是组合对象,“食材”看作是叶子节点。整个家庭聚会的准备工作就是一个“部分-整体”的层次结构,与组合模式中的结构类似。

家庭聚会的组合模式类比

  • 整体(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 方法为统一的操作,既可以准备单个食材,也可以准备整个菜肴。

总结

通过这个日常生活中的类比,我们可以看到组合模式如何在软件设计中发挥作用。它允许我们以统一的方式操作单个对象和组合对象,简化了客户端代码,并使得整个结构更加灵活。在设计系统时,考虑到部分-整体的关系,可以帮助我们更好地应用组合模式。

http://www.lryc.cn/news/334385.html

相关文章:

  • WPF OnStartup
  • docker-相关
  • 二十、Rust AOP 切面增强
  • 掌握Go语言:Go语言精细错误,清晰、高效的错误处理实践(32)
  • Spring与Web环境的集成
  • 二叉树的遍历——bfs广度优先搜索
  • 飞鸟写作可靠吗 #职场发展#经验分享#经验分享
  • Java 实现自定义注解
  • 代码随想录Day48
  • Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus
  • ADB 操作命令及其详细用法
  • 类的函数成员(三):拷贝构造函数
  • C#操作MySQL从入门到精通(8)——对查询数据进行高级过滤
  • Centos 7 安装通过yum安装google浏览器
  • 题目:学习使用按位与 。
  • 逐步分解,一文教会你如何用 jenkins+docker 实现主从模式
  • WebSocket 对于手游的意义
  • 安卓APP的技术质量:如何提高
  • 二分查找 -- 力扣(LeetCode)第704题
  • Windows下如何确定虚函数在虚函数表中的位置
  • C++设计模式:观察者模式(三)
  • CentOS运行Py脚本报错illegal instruction故障处理
  • 软件设计师——1.备考提纲
  • [开源] 基于GRU的时间序列预测模型python代码
  • SQL SERVER 备份
  • 提示词专场:从调整提示改善与LLMs的沟通,到利用LLMs优化提示效果
  • 测开面经(pytest测试案例,接口断言,多并发断言)
  • Golang 开发实战day09 - package Scope
  • 24考研-东南大学916经验贴
  • 【AI面试】YOLO 如何通过 k-means 得到 anchor boxes的?Yolo、SSD 和 faster rcnn 的正负样本定义