C++中的组合模式

目录

组合模式(Composite Pattern)

实际应用

文件系统

组织结构

图形对象

总结


组合模式(Composite Pattern)

组合模式是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和对象组合。这个模式特别适用于需要表示层次结构的场景,例如文件系统、组织结构等。

实际应用

组合模式的核心思想是将单个对象和组合对象都实现同一个接口,从而使得客户端可以一致地处理它们。

文件系统

实现一个文件系统,其中文件和目录都可以被统一处理。

#include <iostream>
#include <string>
#include <vector>
#include <memory>// 抽象基类,表示文件系统中的一个节点
class FileSystemNode {
public:virtual ~FileSystemNode() = default;virtual void display(int depth = 0) const = 0;
};// 叶子节点,表示文件
class File : public FileSystemNode {
private:std::string name;
public:File(const std::string& name) : name(name) {}void display(int depth = 0) const override {std::cout << std::string(depth, ' ') << "File: " << name << "\n";}
};// 组合节点,表示目录
class Directory : public FileSystemNode {
private:std::string name;std::vector<std::shared_ptr<FileSystemNode>> children;
public:Directory(const std::string& name) : name(name) {}void add(const std::shared_ptr<FileSystemNode>& node) {children.push_back(node);}void display(int depth = 0) const override {std::cout << std::string(depth, ' ') << "Directory: " << name << "\n";for (const auto& child : children) {child->display(depth + 2);}}
};int main() {auto root = std::make_shared<Directory>("root");auto home = std::make_shared<Directory>("home");auto user = std::make_shared<Directory>("user");auto file1 = std::make_shared<File>("file1.txt");auto file2 = std::make_shared<File>("file2.txt");auto file3 = std::make_shared<File>("file3.txt");root->add(home);home->add(user);user->add(file1);user->add(file2);root->add(file3);root->display();return 0;
}

组织结构

实现一个组织结构,其中员工和部门都可以被统一处理。

#include <iostream>
#include <string>
#include <vector>
#include <memory>// 抽象基类,表示组织结构中的一个节点
class OrganizationComponent {
public:virtual ~OrganizationComponent() = default;virtual void display(int depth = 0) const = 0;
};// 叶子节点,表示员工
class Employee : public OrganizationComponent {
private:std::string name;
public:Employee(const std::string& name) : name(name) {}void display(int depth = 0) const override {std::cout << std::string(depth, ' ') << "Employee: " << name << "\n";}
};// 组合节点,表示部门
class Department : public OrganizationComponent {
private:std::string name;std::vector<std::shared_ptr<OrganizationComponent>> members;
public:Department(const std::string& name) : name(name) {}void add(const std::shared_ptr<OrganizationComponent>& component) {members.push_back(component);}void display(int depth = 0) const override {std::cout << std::string(depth, ' ') << "Department: " << name << "\n";for (const auto& member : members) {member->display(depth + 2);}}
};int main() {auto company = std::make_shared<Department>("Company");auto hr = std::make_shared<Department>("HR");auto it = std::make_shared<Department>("IT");auto alice = std::make_shared<Employee>("Alice");auto bob = std::make_shared<Employee>("Bob");auto charlie = std::make_shared<Employee>("Charlie");company->add(hr);company->add(it);hr->add(alice);it->add(bob);it->add(charlie);company->display();return 0;
}

图形对象

实现一个图形对象层次结构,其中基本图形(如圆形、矩形)和复合图形(由多个基本图形组成)都可以被统一处理。

#include <iostream>
#include <vector>
#include <memory>// 抽象基类,表示图形
class Graphic {
public:virtual ~Graphic() = default;virtual void draw() const = 0;
};// 叶子节点,表示圆形
class Circle : public Graphic {
public:void draw() const override {std::cout << "Drawing Circle\n";}
};// 叶子节点,表示矩形
class Rectangle : public Graphic {
public:void draw() const override {std::cout << "Drawing Rectangle\n";}
};// 组合节点,表示复合图形
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 circle1 = std::make_shared<Circle>();auto circle2 = std::make_shared<Circle>();auto rectangle1 = std::make_shared<Rectangle>();auto composite1 = std::make_shared<CompositeGraphic>();composite1->add(circle1);composite1->add(rectangle1);auto composite2 = std::make_shared<CompositeGraphic>();composite2->add(circle2);composite2->add(composite1);composite2->draw();return 0;
}

总结

组合模式使得单个对象和组合对象可以被统一处理。所以无论是文件系统、组织结构还是图形对象,组合模式都能很好地表示层次结构。

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

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

相关文章

沃尔玛自养号测评:优势与技术要求解析

沃尔玛自养号测评是一种卖家在沃尔玛平台上提升店铺权重和排名的营销手段。传统运营策略的局限性日益显现&#xff0c;如营销手段单一、难以应对市场竞争等。因此&#xff0c;许多卖家为了提升店铺权重和排名&#xff0c;选择了自养号测评这一技术手段。 以下是对沃尔玛自养号…

关于BERT和embedding

embedding到一个低维向量&#xff0c;但是需要回到onehot高维表示&#xff0c;所以大部分填词游戏最后都需要加上一个MLP接头。 word2vec如此简单的结构&#xff0c;学习到的是embedding 基于计数的统计方法和word2vec融合就形成了glove词嵌入模型 总结&#xff1a;通过各种…

消费者消费数据时报错:INVALID_REPLICATION_FACTOR

今天部署了kafka集群&#xff0c;三台服务器&#xff0c;启动后&#xff0c;生产者发送数据&#xff0c;消费者接收数据的时候报错&#xff0c;INVALID_REPLICATION_FACTOR。 查了很多资料&#xff0c;说是要改kafka下config目录的server.properties,可能是副本数太小&#xff…

WPS中XLS表格使用的技巧记录

我遇到一个问题&#xff0c;xls表格中有一列数据的格式是会计专用&#xff0c;金额前面有货币符号&#xff0c;但是我想复制这列数据为普通的文本&#xff0c;并且在后面添加.00&#xff0c;有什么方法可以做到。 TEXT(B2, “0”) & “.00”

【第5章】Stable Diffusion大模型(简介/两种版本/安装/模型推荐/使用方式)ComfyUI基础入门教程

🍩 大模型简介 大模型,又称为Stable Diffusion模型,所有Stable Diffusion的绘图都是以该模型能力为基础上进行的。 发展到现在,大模型已经更新了很多个版本,大家听说过的可能有Stable Diffusion 1.4(简称SD1.4),Stable Diffusion 1.5(简称SD1.5),Stable Diffusion 2.0…

【react】如何合理使用useEffect

useEffect 是 React Hooks API 的一部分,它允许你在函数组件中执行副作用操作,比如数据获取、订阅或者手动更改 DOM。合理使用 useEffect 可以帮助你管理组件的生命周期行为,同时避免不必要的渲染和性能问题。以下是一些关于如何合理使用 useEffect 的建议: 明确依赖项: 当…

【计算机视觉】人脸算法之图像处理基础知识(四)

图像的几何变换 图像的几何变换是指在不改变图像内容的前提下对图像的像素进行空间几何变换。主要包括图像的平移变换、镜像变换、缩放和旋转等。 1.插值算法 插值通常用来放缩图像大小&#xff0c;在图像处理中常见的插值算法有最邻近插值法、双线性插值法、二次立方、三次…

sap怎么批量给信息记录打上删除标识

1.MEMASSIN-----事务代码 2.选择完成字段 3.根据条件查询需要冻结的信息记录 4.输入查询条件 5.全部勾选完成标识&#xff0c;点击保存&#xff0c;即可冻结完成

特殊矩阵:零矩阵(Zero)幺矩阵(Ones)单位矩阵(Identity)随机矩阵(Random)#matlab

在MATLAB中&#xff0c;通用的特殊矩阵主要包括以下几种&#xff0c;每种都有其特定的函数来创建&#xff1a; 零矩阵&#xff08;Zero Matrix&#xff09; 使用zeros函数创建,&#xff0c;元素全为0。 格式&#xff1a; zeros(m, n): 创建一个m行n列的零矩阵。 zeros(n):…

盘点国内外免费AI视频工具,助你先人一步拥抱AI

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 6月13日&#xff0c;Luma AI 在 X 平台&#xff08;原 Twitter&#xff09;宣布其视频生成模型 Dream Machine 开放测试&#xff0c;并提供免费试用&#xff0c;这在海外 AI 圈掀起了一…

配置中心理论学习

配置中心是一种用于集中管理应用程序配置信息的系统或服务。在微服务架构中&#xff0c;由于服务数量众多且可能分布在不同的环境中&#xff0c;配置中心的作用尤为突出。它允许开发者将配置信息从应用程序代码中分离出来&#xff0c;集中存储和管理&#xff0c;从而提高配置的…

C#防止多次注册事件

事件声明和使用部分的代码&#xff0c;防止多次注册事件主要通过判断事件中类型的委托实例是否为空实现 public class ReRegisterEvent {public delegate void Mydelegate(string message);private Mydelegate? mydel;public event Mydelegate Myevent{add{if (mydel null){…

买什么样的护眼大路灯比较好?五款专业级别的护眼灯推荐

在这个生活节奏的加快和科技的进步的时代&#xff0c;许多家长越来越关注生活质量以及身心健康问题。其中孩子的眼睛视力健康也逐渐引起了家长们的注意。 现在的孩子从早上睁开眼就开始学习&#xff0c;有时候还需要使用到电子产品辅助学习&#xff0c;晚上的写作业的情况更是…

【perl】基本语法 /备忘录/

分享 perl 语言学习资源 Perl 教程|极客教程 (geek-docs.com) Perl [zh] (runebook.dev) Perl 运算符 | 菜鸟教程 (runoob.com) Perl Documentation - Perldoc Browser Search the CPAN - metacpan.org 当然还有一些经典书籍&#xff0c;不再列举。 1、数字 1.1、数字表…

判断QT程序是否重复运行

打开exe&#xff0c;再次打开进行提示。 main.cpp添加&#xff1a; #include "QtFilePreview.h" #include <QtWidgets/QApplication> #include <windows.h> #include <qmessagebox.h> #pragma execution_character_set("utf-8")bool Ch…

java-抽象类和抽象方法1

## Java中的抽象类和抽象方法 ### 1. 抽象类的基本概念 在Java中&#xff0c;抽象类&#xff08;Abstract Class&#xff09;是用来声明一个类不完整&#xff0c;不能被实例化的。抽象类通常用作其他类的基类&#xff0c;为子类提供统一的接口和部分实现。抽象类使用abstract…

leetcode打卡#day46 322. 零钱兑换、279. 完全平方数、139. 单词拆分

322. 零钱兑换 class Solution { public:int coinChange(vector<int>& coins, int amount) {//min countvector<int> dp(amount1, INT_MAX);int n coins.size();//initdp[0] 0;//不包含顺序, 先物品再容量for (int i 0; i < n; i) {for (int j coins[i…

免费个人站 独立站 wordpress 自建网站

制作免费网站 | 免费网站构建器 | WordPress.com https://bioinformatics7.wordpress.com WordPress.com

【总线】设计fpga系统时,为什么要使用总线?

目录 为什么用总线 为什么选择AMBA 总结 系列文章 【总线】AMBA总线架构的发展历程-CSDN博客 【总线】设计fpga系统时&#xff0c;为什么要使用总线&#xff1f;-CSDN博客 【总线】AMBA总线家族的明星成员&#xff1a;AXI协议简介-CSDN博客 为什么用总线 在FPGA系统设计…

【Python安装教程】2024年最新版Python环境搭建及模块安装,保姆教程,手把手操作,不信你还不会!

前言 Python 可应用于多个平台&#xff0c;如 Windows 、 Linux 和 MacOS 。 如何检测电脑是否安装了Python&#xff1f; 按键盘winR键&#xff0c;打开运行框。输入CMD&#xff0c;回车确定。输入where Python后回车&#xff0c;如有安装则会显示Python的安装位置。如未安装…