组合模式(Composite Pattern)C++

上一节:桥接模式(Bridge Pattern) C++

文章目录

  • 0.理论
    • 1.目的与应用场景
    • 2.实现方式
  • 1.实践

0.理论

组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端通过一个统一的接口操作单个对象和组合对象,这简化了客户端的使用,同时支持树形结构的复杂性管理。

1.目的与应用场景

组合模式的主要目的是让单个对象和组合对象的使用有一致性,它主要用于以下场景:

  • 当你希望客户端可以忽略组合对象与单个对象的差异时。
  • 当你希望以相同的方式处理单个对象和组合对象时。

这种模式特别适用于那些希望能够将对象组合成树状结构,以表示整体-部分层次结构的场景。例如,图形界面组件、文件系统目录结构、公司组织结构等都可以用组合模式来表示。

2.实现方式

  • Component(抽象组件):定义了叶子和容器对象的共有接口和行为(如添加、移除子对象的操作),使得客户端可以通过一个统一的接口处理单个对象和组合对象。
  • Leaf(叶子组件):表示叶子节点对象,叶子节点没有子节点,实现了抽象组件的行为。
  • Composite(组合组件):定义有子部件的那些对象的行为,存储子部件,实现了在抽象组件中与子部件有关的操作和接口。

在这里插入图片描述



1.实践

在游戏开发中,组合模式可以用于表示游戏中的菜单系统、UI组件层次、游戏角色的装备系统等,其中每个部分既可以是一个单一对象,也可以是一个由多个对象组成的复合对象。

假设我们正在开发一个游戏,其中包含一个角色,这个角色可以装备多种物品,如武器、护甲等。每种装备又可以包含更多的子部件(例如,护甲可以包括头盔、胸甲、护腿等)。我们希望设计一个系统,允许角色装备单个物品或物品的组合,同时能够统一处理这些物品或物品组合。

Component(抽象组件)

定义一个表示装备部件的Component接口:

// 装备组件接口
class Equipment {
public:virtual void display() const = 0;virtual ~Equipment() {}
};

Leaf(叶子组件)

实现Leaf节点,表示没有子部件的单一装备:

// 单一装备,如武器或特定类型的护甲
class SimpleEquipment : public Equipment {std::string name;
public:SimpleEquipment(const std::string& name) : name(name) {}void display() const override {std::cout << "Equipment: " << name << std::endl;}
};

Composite(组合组件)

实现Composite类,表示可以包含其他装备(子部件)的复合装备:

// 复合装备,可以包含多个装备,如完整的护甲套装
class CompositeEquipment : public Equipment {std::string name;std::vector<Equipment*> children;
public:CompositeEquipment(const std::string& name) : name(name) {}void add(Equipment* equipment) {children.push_back(equipment);}void display() const override {std::cout << "Composite Equipment: " << name << std::endl;for(const auto& child : children) {child->display();}}
};

现在,我们可以创建具体的装备和装备组合,并展示它们:

// 创建具体装备
Equipment* sword = new SimpleEquipment("Sword");
Equipment* shield = new SimpleEquipment("Shield");// 创建一个护甲套装,包含头盔和胸甲
CompositeEquipment* armorSet = new CompositeEquipment("Armor Set");
armorSet->add(new SimpleEquipment("Helmet"));
armorSet->add(new SimpleEquipment("Chestplate"));// 创建一个角色的装备组合,包括武器、护盾和护甲套装
CompositeEquipment* characterEquipment = new CompositeEquipment("Character Equipment");
characterEquipment->add(sword);
characterEquipment->add(shield);
characterEquipment->add(armorSet);// 展示角色的所有装备
characterEquipment->display();

在这个例子中,无论是单个装备还是由多个装备组成的装备套装,都被统一地处理和展示。这体现了组合模式的强大之处:客户代码可以以统一的方式处理单个对象和组合对象,从而简化了客户代码的复杂度。这在游戏开发中尤为重要,因为游戏中的物体和实体往往具有复杂的层次结构。

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

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

相关文章

枚举(蓝桥练习)

目录 一、枚举算法介绍 二、解空间的类型 三、循环枚举解空间 四、例题 &#xff08;一、反倍数&#xff09; &#xff08;二、特别数的和&#xff09; &#xff08;三、找到最多的数&#xff09; &#xff08;四、小蓝的漆房&#xff09; &#xff08;五、小蓝和小桥的…

tkinterFrame框架+标签框架LabelFrame+Toplevel窗口的使用

1.在tkinter中&#xff0c;Frame是一个容器小部件用于组织和管理其他小部件。它可以作为一个独立的可见区域&#xff0c;也可以作为其他小部件的父容器。 import tkinter as tk import tkinter.ttk as ttk import tkinter.messagebox as mbm tk.Tk() m.title("tkinter L…

10.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏发送数据的操作

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;接管游戏连接服务器的操作 码云地址&#xff08;master 分支&#xff09;&#xff1a;染指/titan 码云版本号&#xff1a;00820853d5492fa7b6e32407d46b5f9c01930ec6 代码下载地址&#xff0c;在 ti…

Rocky Linux 运维工具 firewall-cmd

一、firewall-cmd​的简介 ​​firewall-cmd​是基于firewalld的防火墙管理工具。用户可以使用它来配置、监控和管理防火墙规则&#xff0c;包括开放端口、设置服务规则等。 二、firewall-cmd​​的参数说明 序号参数描述1​​–zone指定防火墙区域2–add-portxxx/tcp允许特定…

广和通发布基于MediaTek T300平台的RedCap模组FM330系列及解决方案

世界移动通信大会MWC 2024期间&#xff0c;广和通发布基于MediaTek T300平台的RedCap模组FM330系列&#xff0c;加速5G-A繁荣发展。FM330系列及其解决方案采用全球先进RedCap方案&#xff0c;满足移动宽带和工业互联对高能效的需求。 广和通FM330系列采用全球首款6nm制程且集成…

早产儿视网膜病变分期,自动化+半监督(无需大量医生标注数据)

早产儿视网膜病变 ROP 分期 提出背景解法框架解法步骤一致性正则化算法构建思路 实验 提出背景 论文&#xff1a;https://www.cell.com/action/showPdf?piiS2589-0042%2823%2902593-2 早产儿视网膜病变&#xff08;ROP&#xff09;目前是全球婴儿失明的主要原因之一。 这是…

【DDD】学习笔记-模型对象

不同的建模视角会产生不同的模型&#xff0c;但这并不意味着选择一种建模视角就仅仅会产生一种模型&#xff0c;而是指建模的过程围绕着什么样的模型为核心。领域模型驱动设计自然以领域模型为核心&#xff0c;但在限界上下文内部&#xff0c;分层架构的不同层次仍然可能由不同…

C++:string相关内容的简单介绍

目录 介绍&#xff1a; string类的常见接口说明 1. string类的常见构造 1.1 string(const string& str,size_t pos,size_t len npos); 1.2 string(const char* s) 1.3 string &#xff08;const char * s , size_t n&#xff09;; 1.4 string&#xff08;size_…

图搜索基础-深度优先搜索

图搜索基础-深度优先搜索 参考原理引入流程解析手推例子 代码实现运行结果结果分析 参考 理论参考&#xff1a;深蓝学院 实现参考&#xff1a;github项目 原理 引入 对于这样一个图&#xff0c;我们试图找到S到G的通路&#xff1a; 计算机程序不会像人眼一样&#xff0c;一…

npm淘宝镜像报错certificate has expired

1、概述 vue项目使用npm install命令时&#xff0c;突然报错&#xff1a;“...certificate has expired” 2、解决 1.清空缓存&#xff1a;npm cache clean --force 2.修改镜像&#xff08;管理员运行命令行&#xff09;&#xff1a;npm config set registry https:/…

测评ONLYOFFICE 8.0版本:办公利器再升级

测评ONLYOFFICE 8.0版本&#xff1a;办公利器再升级 前言注册使用升级功能速览全新外观设计wordexcelPPTPDF 协作功能强化更强大的功能复杂表单的填写 移动端优化结语 前言 随着科技的不断发展&#xff0c;办公软件在提升用户体验和工作效率方面扮演着越来越重要的角色。作为一…

element el-date-picker 日期组件置灰指定日期范围、禁止日期范围日期选择

JS如何将当前日期或指定日期转时间戳_javascript技巧_脚本之家 小于指定日期前的日期置灰 比如这里 指定日期是 2024-02-20 10:48:15 disabledDate(time) time是一个函数提供的时间用于比较 他是一个时间戳↓ 理解为我们想要置灰的时间 time.getTime() < timeStamps- 1 *…

可视化图文报表

Apache Echarts介绍 Apache Echarts是一款基于Javascript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网&#xff1a;Apache ECharts 入门案例&#xff1a; <!DOCTYPE html> <html>…

06 Qt自绘组件:Switch动画开关组件

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

SD-WAN助力企业数据传输安全

随着企业网络需求的不断增长&#xff0c;SD-WAN成为企业网络组网的首选方案&#xff0c;能够实现多种网络拓扑结构的无缝连接&#xff0c;其中包括总部-分支、总部-分支-数据中心、总部-数据中心、总部-分支-云服务等。如何确保企业数据在传输过程中的安全性成为企业关注的重要…

对话式 AI 简化业务的 5 种方式

告别繁琐工作&#xff0c;对话式AI让内部沟通更高效 对话式人工智能正在彻底改变企业与客户互动、简化运营并增强客户体验的方式。 对话式人工智能可以通过以下五种方式改变您的业务&#xff1a; 1. 对话式人工智能&#xff1a;增强客户服务对话式人工智能通过聊天机器人和虚拟…

SpringMVC(2)

目录 SSM整合统一异常处理项目异常处理方案异常解决方案前后端协议联调拦截器 SSM整合 统一异常处理 异常的种类及出现异常的原因: 框架内部抛出的异常&#xff1a;因使用不合规导致数据层抛出的异常&#xff1a;因外部服务器故障导致&#xff08;例如&#xff1a;服务器访问超…

UE 贴地绘制/日历/鼠标光标滚轮位置缩放图片/UMG滚动数据从前后添加新UI/多图片批量下载 收费项目源码资源

基本里面的内容本人CSDN发的都有现成代码.里面大部分是功能实现思路.这里面是把这几个功能合成了一个完整5.1项目源码.拿到即用.收费项目源码资源. 1.贴地绘制 2.日历 3.鼠标光标滚轮位置缩放图片 \ 4.UMG滚动数据从前后添加新UI思路 5.多图片批量下载 这是整合的懒人源码包收…

逆向案例一:AES解密基于数位观察城市数据

import requests import json from Crypto.Cipher import AES # 开始解密 from Crypto.Util.Padding import unpad #去填充的逻辑 import base64 url https://app.swguancha.com/client/v1/cPublic/consumer/baseInfo data {current: 1,"dimensionTime": "20…

langChain学习笔记(待续)

目录 IntroductionLLM的限制扩展理解&#xff1a;什么是机器学习扩展阅读&#xff1a;机器学习的流程 LangChain Introduction LLM的限制 大型语言模型&#xff0c;比如ChatGpt4&#xff0c;尽管已经非常强大&#xff0c;但是仍然存在一些限制&#xff1a; 知识更新&#xff…