C++中的组合模式

embedded/2024/11/21 16:32:43/

组合模式(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/embedded/139381.html

相关文章

用Python“拍立淘”:在1688的海洋里寻找宝藏

想象一下&#xff0c;你是一名勇敢的探险家&#xff0c;手持一张神秘的藏宝图&#xff0c;准备在阿里巴巴的1688海洋中寻找那些隐藏的宝贝。但这次&#xff0c;你的武器不是传统的铲子和罗盘&#xff0c;而是Python爬虫。我们将一起编写一段代码&#xff0c;让它成为我们的“拍…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗&#xff0c;一个程序写了三天写不出来&#xff0c;主要是耗时太多了&#xff0c;老板一直不满意。想在VScode上跑一下&#xff0c;昨晚一直报错。今天来公司重新搞了一下&#xff0c; 主要工作有&#xff1a; 1&#xff0c;读取当前时间用tscns 2&#xff0c;输…

Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化教…

MySQL 架构概览

show processlist;命令查询所有正在运行的线程 MySql架构从上到下分为网络连接层&#xff0c;系统服务层&#xff0c;存储引擎层&#xff0c;文件系统层 1.网络连接层主要负责维护客户端的连接&#xff0c;保存session会话&#xff0c;以及多线程下的连接管理。 2.系统服务层…

【Vim/Vi/Gvim操作】:列操作

文章目录 列操作1. 列选择模式1.1 visual 模式1.2 visual line模式1.3 visual block模式 2.列操作2.1 行首插入操作2.2 替换操作 列操作 1. 列选择模式 1.1 visual 模式 命令行状态下按下小写v&#xff0c;默认进入到visual模式&#xff0c;该模式相当于在window中按下鼠标左…

经典面试力扣392判断子序列

给定字符串s和t&#xff0c;判断s是否为t的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除&#xff09; 字符而不改变剩余字符相对位置形成的新字符串。 (例如&#xff0c;"ace"是"abcde"的一个子序列&#xff0c;而"aec"不是)。…

静态时序分析--时序约束

目录 1.时钟约束1.1创建时钟1.2.生成时钟1.3虚拟时钟1.4 最小时钟脉宽 2.I/O延时约束2.1设置输入延时2.2设置输出延时 3.I/O环境建模约束3.1输入驱动建模3.2输出负载建模 4.时序例外4.1多周期路径设置&#xff08;multicycle path&#xff09;4.2伪路径设置&#xff08;false_p…

Mybatis-Plus 多租户插件属性自动赋值

文章目录 1、Mybatis-Plus 多租户插件1.1、属性介绍1.2、使用多租户插件mavenymlThreadLocalUtil实现 定义,注入租户处理器插件测试domianservice & ServiceImplmapper 测试mapper.xml 方式 1.3、不使用多租户插件 2、实体对象的属性自动赋值使用1. 定义实体类2. 实现 Meta…