C++中的组合模式

news/2024/11/22 6:26:12/

组合模式(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.ppmy.cn/news/1548963.html

相关文章

基于 PyTorch 从零手搓一个GPT Transformer 对话大模型

一、从零手实现 GPT Transformer 模型架构 近年来&#xff0c;大模型的发展势头迅猛&#xff0c;成为了人工智能领域的研究热点。大模型以其强大的语言理解和生成能力&#xff0c;在自然语言处理、机器翻译、文本生成等多个领域取得了显著的成果。但这些都离不开其背后的核心架…

php:使用socket函数创建WebSocket服务

一、前言 闲来无事&#xff0c;最近捣鼓了下websocket&#xff0c;但是不希望安装第三方类库&#xff0c;所以打算用socket基础函数创建个服务。 二、构建websocket服务端 <?phpclass SocketService {// 默认的监听地址和端口private $address 0.0.0.0;private $port 8…

SEO网站都用哪里的服务器

在当今这个信息爆炸的时代&#xff0c;网站的加载速度已经成为衡量其质量的重要指标之一。对于SEO网站来说&#xff0c;速度不仅关乎用户体验&#xff0c;更是影响搜索引擎排名的重要因素。在众多服务器提供商中&#xff0c;鼎峰新匯凭借其卓越的性能和优质的服务&#xff0c;成…

IC脚本之perl

Perl 是一种功能丰富的计算机程序语言&#xff0c;运行在超过100种计算机平台上。IC flow 的 流传的古老版本大多是也是使用这种语言&#xff0c;这里会对Perl的常用知识点进行总结。 Note: 所有的语句必须以 “ &#xff1b;”结尾&#xff1b;所有的数据必须先定义才可以使…

STM32与CS创世SD NAND(贴片SD卡)结合完成FATFS文件系统移植与测试是一个涉及硬件与软件综合应用的复杂过程

一、前言 在STM32项目开发中&#xff0c;经常会用到存储芯片存储数据。 比如&#xff1a;关机时保存机器运行过程中的状态数据&#xff0c;上电再从存储芯片里读取数据恢复&#xff1b;在存储芯片里也会存放很多资源文件。比如&#xff0c;开机音乐&#xff0c;界面上的菜单图…

[HNCTF 2022 Week1]你知道什么是Py嘛?

下载附件是一个py文件&#xff0c;python反编译工具打开。 这段代码是一个简单的Python脚本&#xff0c;用于验证用户输入的字符串&#xff08;称为“flag”&#xff09;是否符合特定的格式和加密规则。分析代码是一个简单的xor异或即&#xff1a;程序将遍历字符串的每个字符&…

5、深入剖析PyTorch DataLoader源码

文章目录 1. 重要类2. DataSet3. DataLoader4. Python实例 参考大神B站&#xff0c;记录学习笔记 5、深入剖析PyTorch DataLoader源码 其他大神笔记&#xff1a; pytorch数据操作—dataset&#xff0c;dataloader&#xff0c;transform 1. 重要类 Data LoaderDatasetSampleRa…

.NET 9 中 LINQ 新增功能实操

LINQ 介绍 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串&#xff0c;没有编译时类型检查或 IntelliSense 支持。 此外&#xff0c;需要针对每种类型的数据源了解不同的查询语言&#xff1a;SQL 数据库、XML 文档、…