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

【设计模式】组合模式

【设计模式】组合模式

介绍

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。这种模式通过定义一个统一的接口,使得树形结构中的叶子节点和组合节点能够以相同的方式进行处理。

优点

  1. 一致性:组合模式提供了一种处理单个对象和组合对象的统一方式,使得客户端代码可以一致地处理复杂树形结构和简单对象。
  2. 灵活性:通过组合模式,你可以方便地添加新类型的组件,而不需要修改现有代码,符合开闭原则(Open-Closed Principle)。
  3. 简化客户端代码:客户端代码不需要区分处理单个对象和组合对象的方式,降低了代码的复杂性。

适用场景

  1. 需要表示对象的部分-整体层次结构:当你需要表示一个对象是由多个子对象组成的复杂结构时,组合模式是一个理想的选择。
  2. 希望客户端统一处理单个对象和组合对象:如果你希望客户端代码在处理单个对象和组合对象时能够使用一致的方式,可以考虑使用组合模式。
  3. 需要动态地增加或删除对象的组成部分:组合模式允许你在运行时方便地增加或删除组成部分,而不影响其他部分的操作。

代码示例

以下是一个组合模式的C++代码示例,展示了如何使用组合模式来构建一个简单的图形绘制系统:

#include <iostream>
#include <vector>
#include <memory>// 组件接口
class Graphic {
public:virtual void draw() const = 0;virtual ~Graphic() = default;
};// 叶子节点类 - 线
class Line : public Graphic {
public:void draw() const override {std::cout << "Drawing a line." << std::endl;}
};// 叶子节点类 - 圆
class Circle : public Graphic {
public:void draw() const override {std::cout << "Drawing a circle." << std::endl;}
};// 组合节点类 - 图形组合
class CompositeGraphic : public Graphic {
private:std::vector<std::shared_ptr<Graphic>> children;
public:void add(const std::shared_ptr<Graphic>& graphic) {children.push_back(graphic);}void draw() const override {for (const auto& child : children) {child->draw();}}
};int main() {auto line1 = std::make_shared<Line>();auto line2 = std::make_shared<Line>();auto circle = std::make_shared<Circle>();auto composite1 = std::make_shared<CompositeGraphic>();composite1->add(line1);composite1->add(circle);auto composite2 = std::make_shared<CompositeGraphic>();composite2->add(line2);composite2->add(composite1);composite2->draw();return 0;
}
  1. 组件接口Graphic 类是所有具体图形类的基类,定义了一个纯虚函数 draw,要求所有子类必须实现这个函数。
  2. 叶子节点类LineCircle 类是具体的图形类,实现了 Graphic 接口的 draw 方法。
  3. 组合节点类CompositeGraphic 类是一个组合节点,它可以包含多个 Graphic 对象(无论是 LineCircle 还是其他 CompositeGraphic),并且实现了 draw 方法,调用所有子节点的 draw 方法。
  4. 客户端代码:在 main 函数中,创建了多个叶子节点和组合节点,通过组合模式构建了一个树形结构,并调用组合节点的 draw 方法来绘制整个图形。

通过这个示例,你可以看到组合模式如何使得客户端代码能够统一处理单个对象和组合对象,简化了复杂对象结构的处理。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 从快到慢学习Git指令
  • 如何编写一个CMakeLists.txt文件(由简到难,较详细)
  • RS®ZN-Z8x 开关矩阵
  • 映客基于Apache SeaTunnel 打造高效的一站式数据集成平台
  • 自然语言处理顶会​​​​ACL 2024录用阿里云38篇论文,通义团队披露多项大模型前沿技术
  • html+css 实现hover 3D按钮特效
  • 王道数据结构 | 第五章 树与二叉树【未完成】
  • ubuntu 20.04 右键新建空白文档;输入即定位文件或文件夹,而非出现搜索框
  • 0813,引用,函数重载,内存布局叭叭叭
  • C++的内存管理是怎样的?
  • 最小二乘法求拟合曲线(中线)的斜率和截距:数据背后的温柔对话
  • Python实例化指南之对象创建与初始化的实用技巧详解
  • 前端踩坑DOMException: Failed to execute ‘querySelector‘ on ‘Document‘: ‘#091.....‘
  • MySQL的InnoDB的页里面存了些什么 --InnoDB存储梳理(三)
  • .NET 8 跨平台高性能边缘采集网关
  • 【个人向】《HTTP图解》阅后小结
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • create-react-app做的留言板
  • export和import的用法总结
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • js递归,无限分级树形折叠菜单
  • Laravel核心解读--Facades
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Markdown 语法简单说明
  • Python_网络编程
  • redis学习笔记(三):列表、集合、有序集合
  • sessionStorage和localStorage
  • 初识 beanstalkd
  • 分类模型——Logistics Regression
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于web的全景—— Pannellum小试
  • 算法系列——算法入门之递归分而治之思想的实现
  • 温故知新之javascript面向对象
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Semaphore
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C++20) consteval立即函数
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)基于IDEA的JAVA基础10
  • (转)3D模板阴影原理
  • .net framework profiles /.net framework 配置
  • .NET WPF 抖动动画
  • .NET/C# 的字符串暂存池
  • .NET6实现破解Modbus poll点表配置文件
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net通用权限框架B/S (三)--MODEL层(2)
  • :=
  • @Builder用法
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @JoinTable会自动删除关联表的数据