网站反链有好处吗,广告公司名称怎么起,两学一做是什么网站,广东建设信息网是什么网站组合模式#xff08;Composite Pattern#xff09;允许将对象组合成树形结构#xff0c;使得客户端以统一的方式处理单个对象和组合对象。以下是一个经典的 C 实现示例#xff0c;包含透明式设计#xff08;基类定义统一接口#xff09;和内存管理#xff1a;
#include…组合模式Composite Pattern允许将对象组合成树形结构使得客户端以统一的方式处理单个对象和组合对象。以下是一个经典的 C 实现示例包含透明式设计基类定义统一接口和内存管理
#include iostream
#include vector
#include algorithm
#include stdexcept
#include memory// 抽象组件类
class Component {
public:virtual ~Component() default;virtual void operation() const 0;// 管理子组件的透明接口Leaf需处理不支持的操作virtual void add(std::unique_ptrComponent component) {throw std::runtime_error(Unsupported operation: add);}virtual void remove(Component* component) {throw std::runtime_error(Unsupported operation: remove);}virtual const Component* getChild(int index) const {throw std::runtime_error(Unsupported operation: getChild);}
};// 叶子节点类
class Leaf : public Component {
public:explicit Leaf(std::string name) : name_(std::move(name)) {}void operation() const override {std::cout Leaf[ name_ ] 执行操作 std::endl;}private:std::string name_;
};// 组合节点类
class Composite : public Component {
public:void operation() const override {std::cout Composite 执行操作包含 children_.size() 个子组件: std::endl;for (const auto child : children_) {child-operation(); // 递归调用子组件的操作}}void add(std::unique_ptrComponent component) override {children_.push_back(std::move(component));}void remove(Component* component) override {auto it std::find_if(children_.begin(), children_.end(),[component](const std::unique_ptrComponent c) {return c.get() component;});if (it ! children_.end()) {children_.erase(it);}}const Component* getChild(int index) const override {if (index 0 index children_.size()) {return children_[index].get();}return nullptr;}private:std::vectorstd::unique_ptrComponent children_; // 使用智能指针管理生命周期
};// 客户端代码
int main() {// 创建组合结构root - [branch1, branch2]// branch1 - [leaf1, leaf2]// branch2 - [leaf3]auto root std::make_uniqueComposite();auto branch1 std::make_uniqueComposite();branch1-add(std::make_uniqueLeaf(A));branch1-add(std::make_uniqueLeaf(B));auto branch2 std::make_uniqueComposite();branch2-add(std::make_uniqueLeaf(C));root-add(std::move(branch1));root-add(std::move(branch2));// 统一调用操作root-operation();return 0;
}关键点解析 透明式设计 Component 基类定义了所有组件包括叶子节点的公共接口包括 add/remove 等管理子组件的方法。叶子节点 Leaf 继承自 Component但重写 add/remove 时抛出异常代码中省略异常以简化实际可添加。组合节点 Composite 实现子组件管理逻辑并递归调用子组件的 operation()。 内存管理 使用 std::unique_ptr 管理子组件生命周期确保组合对象析构时自动释放所有子组件。避免手动 new/delete减少内存泄漏风险。 递归结构 Composite 的 operation() 会遍历所有子组件并调用它们的操作形成递归处理。
输出结果
Composite 执行操作包含2个子组件:
Composite 执行操作包含2个子组件:
Leaf[A] 执行操作
Leaf[B] 执行操作
Composite 执行操作包含1个子组件:
Leaf[C] 执行操作此实现展示了组合模式的核心思想客户端无需区分叶子节点和组合节点统一通过 Component 接口操作简化了复杂树形结构的处理。