【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;
}
分析与总结
- 简化操作:客户端的操作
- 符合开闭原则:树形结构可以灵活扩展系统 符合开闭原则
- 更好的维护性:组件结构统一,可递归管理