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

embedded/2024/11/27 16:04:11/

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

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

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/embedded/140941.html

相关文章

【微服务】 Eureka和Ribbon

一、Eureka 服务调用出现的问题&#xff1a;在远程调用另一个服务时&#xff0c;我们采用的解决办法是发送一次http请求&#xff0c;每次环境的变更会产生新的地址&#xff0c;所以采用硬编码会出现很多麻烦&#xff0c;并且为了应对并发问题&#xff0c;采用分布式部署&#…

Hive-定时清理无用的临时表

背景&#xff1a; 有一个临时库&#xff0c;大家平时开发过程中比较常用&#xff0c;这个库的表的生命周期没有得到很好的管理&#xff0c;日积月累导致无用表增多&#xff0c;所以跟运维提了个方案&#xff0c;定期清理。提出了一个比较简单的方案。 解决方案&#xff1a; sh…

【Leetcode】3206.交替组1

题目描述&#xff1a; https://leetcode.cn/problems/alternating-groups-i/description/?envTypedaily-question&envId2024-11-26 题目示例&#xff1a; 解题思路 思路一&#xff1a; 1.如果color.size()小于等于2&#xff0c;则构不成环&#xff0c;直接返回结果…

数据结构--Map和Set

目录 一.二叉搜索树1.1 概念1.2 二叉搜索树的简单实现 二.Map2.1 概念2.2 Map常用方法2.3 Map使用注意点2.4 TreeMap和HashMap的区别2.5 HashMap底层知识点 三.Set3.1 概念3.2 Set常用方法3.3 Set使用注意点3.4 TreeSet与HashSet的区别 四.哈希表4.1 概念4.2 哈希冲突与避免4.3…

林业产品推荐:Spring Boot技术挑战

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此林业产品销售信…

数据结构之栈:从原理到实现

1. 什么是栈&#xff1f; 在数据结构中&#xff0c;栈&#xff08;Stack&#xff09;是一种非常基础的线性数据结构&#xff0c;它的特点是后进先出&#xff08;LIFO, Last In First Out&#xff09;。想象一个装盘子的架子&#xff0c;你只能从最上面拿盘子或放盘子&#xff…

【H2O2|全栈】JS进阶知识(十一)axios入门

目录 前言 开篇语 准备工作 获取 介绍 使用 结束语 前言 开篇语 本系列博客主要分享JavaScript的进阶语法知识&#xff0c;本期主要对axios进行基本的了解。 与基础部分的语法相比&#xff0c;ES6的语法进行了一些更加严谨的约束和优化&#xff0c;因此&#xff0c;在…

leetcode hot100【LeetCode 215.数组中的第K个最大元素】java实现

LeetCode 215.数组中的第K个最大元素 题目描述 给定一个整数数组 nums 和一个整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;要求排名是从大到小的&#xff0c;因此第 k 个最大元素是排序后的第 k 个元素。你需要设计一个高效的算法来解决这个问题。…