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

devtools/2024/11/27 7:16:02/

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

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

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.ppmy.cn/devtools/137334.html

相关文章

云原生世界的多面体:K8s、容器云、裸金属与云原生的深度解析

目录 引言Kubernetes&#xff08;K8s&#xff09; K8s 的定义与架构K8s 的优势与局限 容器云 容器云的定义与核心功能容器云与 Kubernetes 的关系 裸金属 裸金属的定义与应用场景裸金属与虚拟化的比较 云原生 云原生的核心理念云原生与 K8s、容器云、裸金属的关系 技术对比与应…

通过指令导入/导出vscode扩展插件

导出扩展&#xff1a; 打开VSCode终端&#xff1a; 在VSCode中&#xff0c;你可以通过菜单栏的“终端”选项打开终端&#xff0c;或者使用快捷键Ctrl &#xff08;反引号&#xff0c;通常在键盘左上角&#xff09;。运行导出命令&#xff1a; 在终端中&#xff0c;输入以下命…

MyBatis 操作数据库(进阶)

1. 动态 SQL 动态 SQL 是 MyBatis 的强大特性之一&#xff0c;能够完成不同条件下不同的 SQL 拼接 官方文档&#xff1a;动态 SQL_MyBatis中文网 1.1 <if> 标签 在注册用户的场景中&#xff0c;注册可能会分为两种字段&#xff1a;必填字段和非必填字段 如&#xff…

一个高度可扩展的 Golang ORM 库【GORM】

GORM 是一个功能强大的 Golang 对象关系映射&#xff08;ORM&#xff09;库&#xff0c;它提供了简洁的接口和全面的功能&#xff0c;帮助开发者更方便地操作数据库。 1. 完整的 ORM 功能 • 支持常见的关系模型&#xff1a; • Has One&#xff08;一对一&#xff09; • …

Spring Boot 整合 ELK 全面指南:实现日志采集、分析与可视化

一、ELK简介 1.1 什么是ELK&#xff1f; ELK 是三个开源工具的组合&#xff1a; Elasticsearch&#xff1a;一个分布式全文搜索和分析引擎&#xff0c;用于存储和查询日志数据。Logstash&#xff1a;一个数据处理管道工具&#xff0c;用于收集、解析和处理日志数据。Kibana&…

深入了解决策树---机器学习中的经典算法

引言 决策树&#xff08;Decision Tree&#xff09;是一种重要的机器学习模型&#xff0c;以直观的分层决策方式和简单高效的特点成为分类和回归任务中广泛应用的工具。作为解释性和透明性强的算法&#xff0c;决策树不仅适用于小规模数据&#xff0c;也可作为复杂模型的基石&…

养宠宠物空气净化器哪个好?实测热销品牌安德迈、希喂、小米

最近啊&#xff0c;猫咪们开始换毛了&#xff0c;不少铲屎官们正打算买个养宠宠物空气净化器呢&#xff0c;但面对众多选择&#xff0c;是不是有点儿犯愁不知道该咋挑&#xff1f;别担心&#xff0c;作为养猫多年的老手&#xff0c;我今天就来实测三款特别火的养宠宠物空气净化…

pcb元器件选型与焊接测试时的一些个人经验

元件选型 在嘉立创生成bom表&#xff0c;对照bom表买 1、买电容时有50V或者100V是它的耐压值&#xff0c;注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出&#xff0c;有那种可调降压比如如下&#xff0c;别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…