**定义:**组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
**应用:**文件和文件夹可以看作是一种树形结构,文件夹可以包含文件和子文件夹,而文件则不包含其他对象。使用组合模式可以方便地遍历文件系统。
代码:
cpp
// 抽象组件类
class Component {
public:
virtual ~Component() = default;
virtual void add(std::shared_ptr<Component> component) = 0;
virtual void display(int depth = 0) const = 0;
};
// 叶子节点:文件类
class File : public Component {
private:
std::string name;
public:
File(const std::string& name) : name(name) {}
void add(std::shared_ptr<Component>) override {
std::cerr << "File cannot have subcomponents!" << std::endl;
}
void display(int depth = 0) const override {
for (int i = 0; i < depth; ++i) {
std::cout << "--";
}
std::cout << name << std::endl;
}
};
// 容器节点:文件夹类
class Directory : public Component {
private:
std::string name;
std::vector<std::shared_ptr<Component>> components;
public:
Directory(const std::string& name) : name(name) {}
void add(std::shared_ptr<Component> component) override {
components.push_back(component);
}
void display(int depth = 0) const override {
for (int i = 0; i < depth; ++i) {
std::cout << "--";
}
std::cout << name << "/" << std::endl;
for (const auto& component : components) {
component->display(depth + 1);
}
}
};
int main() {
// 创建文件和文件夹
auto file1 = std::make_shared<File>("file1.txt");
auto file2 = std::make_shared<File>("file2.txt");
auto dir1 = std::make_shared<Directory>("dir1");
auto dir2 = std::make_shared<Directory>("dir2");
// 构建文件系统树
dir1->add(file1);
dir1->add(file2);
dir2->add(dir1);
// 显示文件系统树
dir2->display();
return 0;
}