当前位置: 首页 > article >正文

C++设计模式之组合模式中适用缓存机制提高遍历与查找速度

在组合设计模式中,为了提高反复遍历和查找的速度,可以引入缓存机制。缓存机制可以通过存储已经遍历过的子组件或计算过的结果来减少重复操作的开销。以下是一个示例,展示了如何在组合模式中使用缓存机制来提高性能。

示例:组合设计模式中的缓存机制

1. 组件接口

定义一个组件接口 Component,所有组件(叶子和组合节点)都实现这个接口。

#include <vector>
#include <unordered_map>
#include <iostream>
#include <string>

class Component {
public:
    virtual void operation() = 0;
    virtual void add(Component* component) {}
    virtual void remove(Component* component) {}
    virtual Component* find(const std::string& name) = 0;
    virtual ~Component() {}
    std::string name;
};

2. 叶子节点

定义一个叶子节点 Leaf,实现 Component 接口。

class Leaf : public Component {
public:
    Leaf(const std::string& name) {
        this->name = name;
    }
    void operation() override {
        std::cout << "Leaf " << name << " operation" << std::endl;
    }
    Component* find(const std::string& name) override {
        return (this->name == name) ? this : nullptr;
    }
};

3. 组合节点

定义一个组合节点 Composite,实现 Component 接口。组合节点管理子组件,并且在查找时使用缓存。

class Composite : public Component {
public:
    Composite(const std::string& name) {
        this->name = name;
    }
    void operation() override {
        std::cout << "Composite " << name << " operation" << std::endl;
        for (auto& component : components) {
            component->operation();
        }
    }
    void add(Component* component) override {
        components.push_back(component);
    }
    void remove(Component* component) override {
        components.erase(std::remove(components.begin(), components.end(), component), components.end());
    }
    Component* find(const std::string& name) override {
        // 检查缓存
        if (cache.find(name) != cache.end()) {
            return cache[name];
        }

        // 遍历子组件查找
        for (auto& component : components) {
            if (component->find(name) != nullptr) {
                cache[name] = component;
                return component;
            }
        }
        return nullptr;
    }

private:
    std::vector<Component*> components;
    std::unordered_map<std::string, Component*> cache;
};

4. 主程序

创建一个组合节点,并添加叶子节点,然后演示如何使用缓存机制提高查找速度。

int main() {
    Composite* root = new Composite("Root");
    root->add(new Leaf("Leaf1"));
    root->add(new Leaf("Leaf2"));

    Composite* subComposite = new Composite("SubComposite");
    subComposite->add(new Leaf("Leaf3"));
    subComposite->add(new Leaf("Leaf4"));
    root->add(subComposite);

    // 第一次查找,缓存未命中
    std::cout << "Searching for 'Leaf3' (first time)..." << std::endl;
    Component* found = root->find("Leaf3");
    if (found) {
        found->operation();
    } else {
        std::cout << "Not found" << std::endl;
    }

    // 第二次查找,缓存命中
    std::cout << "Searching for 'Leaf3' (second time)..." << std::endl;
    found = root->find("Leaf3");
    if (found) {
        found->operation();
    } else {
        std::cout << "Not found" << std::endl;
    }

    delete root;
    return 0;
}

解释

  1. 缓存机制:在 Composite 类中,我们使用 std::unordered_map 来存储子组件的查找结果。当查找操作发生时,首先检查缓存中是否已经存在该组件。如果存在,直接返回缓存中的结果;如果不存在,则遍历子组件进行查找,并将结果存入缓存。

  2. 性能提升:通过使用缓存机制,可以避免反复遍历子组件,从而显著提高查找操作的速度。

  3. 适用场景:这种缓存机制特别适用于树形结构中频繁进行相同查找操作的场景。通过缓存已经查找过的结果,可以减少不必要的递归遍历,提升系统性能。

通过这种方式,你可以在组合设计模式中有效地利用缓存机制来提高反复遍历和查找的速度。


http://www.kler.cn/a/411574.html

相关文章:

  • 1- 9 C 语言面向对象
  • vulnhub靶场之corrosion靶场1
  • 银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法
  • transformer.js(三):底层架构及性能优化指南
  • 梦熊NOIP模拟赛
  • C++:当vector中存储的是自定义类型对象时注意事项
  • lc 146. LRU 缓存
  • 【系统架构设计师】真题论文: 论软件系统架构评估(包括解题思路和素材)
  • HDR视频技术之四:HDR 主要标准
  • 跨子网通信的具体流程
  • 【后端面试总结】MySQL索引
  • 学习日记_20241126_聚类方法(聚合聚类Agglomerative Clustering)
  • 构建与优化数据仓库-实践指南
  • ES6的第四天
  • huggingface使用
  • 【C++】读取数量不定的输入数据
  • 结构方程模型(SEM)入门到精通:lavaan VS piecewiseSEM、全局估计/局域估计;潜变量分析、复合变量分析、贝叶斯SEM在生态学领域应用
  • 无人机舵机转速运行原理!
  • Django 路由层
  • java——Tomcat调优策略
  • Prometheus从二进制部署迁移Docker中更新到v3.0.0版本
  • 【前端】ES6基础
  • 【二叉树】【2.1遍历二叉树】【刷题笔记】【灵神题单】
  • 【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子
  • 堆排序实现
  • Linux服务器驱动安装