【C++】【设计模式】组合模式

【C++】【设计模式】组合模式(Composite Pattern)

定义

  • 结构型设计模式
  • 用于把一组相似的对象当作一个单一的对象,依据树形结构来组合对象,用来表示部分以及整体层次

结构

  • 组件
  • 叶子节点
  • 复合节点

UML类图

在这里插入图片描述

Demo源码

#include <iostream>
#include <string>
#include <vector>
#include <memory>

// 抽象基类,表示文件系统中的文件和文件夹
class FileSystemObject {
public:
    virtual void print() const = 0;
    virtual ~FileSystemObject() {}
};

// 文件类
class File : public FileSystemObject {
private:
    std::string name_;

public:
    File(std::string name) : name_(name) {}

    void print() const override {
        std::cout << "File: " << name_ << std::endl;
    }

    ~File() {
        std::cout << "Deleting File: " << name_ << std::endl;
    }
};

// 文件夹类
class Folder : public FileSystemObject {
private:
    std::string name_;
    std::vector<std::unique_ptr<FileSystemObject>> children_;

public:
    Folder(std::string name) : name_(name) {}

    void add(std::unique_ptr<FileSystemObject> obj) {
        children_.push_back(std::move(obj));
    }

    void remove(FileSystemObject* obj) {
        auto iter = std::find_if(children_.begin(), children_.end(),
            [&](const std::unique_ptr<FileSystemObject>& child) {
                return child.get() == obj;
            });
        if (iter != children_.end()) {
            children_.erase(iter);
        }
    }

    void print() const override {
        std::cout << "Folder: " << name_ << std::endl;
        for (const auto& child : children_) {
            child->print();
        }
    }

    ~Folder() {
        std::cout << "Deleting Folder: " << name_ << std::endl;
    }
};

int main() {
    // 创建文件和文件夹对象
    auto file1 = std::make_unique<File>("file1.txt");
    auto file2 = std::make_unique<File>("file2.jpg");
    auto folder1 = std::make_unique<Folder>("folder1");
    auto folder2 = std::make_unique<Folder>("folder2");

    // 将文件添加到文件夹中
    folder1->add(std::move(file1));
    folder2->add(std::move(file2));

    // 将文件夹添加到另一个文件夹中
    folder2->add(std::move(folder1));

    // 打印整个文件系统
    folder2->print();

    return 0;
}


分析与总结

  • 简化操作:客户端的操作
  • 符合开闭原则:树形结构可以灵活扩展系统 符合开闭原则
  • 更好的维护性:组件结构统一,可递归管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值