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

news/2024/11/27 9:30:06/

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

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

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/news/1550309.html

相关文章

网络--传输层协议--UDP

传输层作用:负责数据能够从发送端传输到接收端。 1、再谈端口号 端口号标识了一个主机上进行通信的不同的应用程序。 1.1、端口号划分范围 0 - 1023 : 知名端口号,HTTP、FTP、SSH等这些广为使用的应用层协议,他们的端口号都是固定的。 10234 - 65536:操作系统动态分配的…

旋转磁体产生的场 - 实验视频资源下载

先发几个视频&#xff0c;是2019年所作的实验内容 更多视频&#xff0c;到某宝找我吧。注意&#xff1a;是收费的。 20190312-180244-旋转磁体产生的场造成激光功率减小 https://download.csdn.net/download/u014161757/90038058 20190313-090956-旋转磁体产生的场对真空介电…

华纳云:服务器网络延迟问题可能由哪些因素引起?

服务器网络延迟是许多在线服务性能问题的根源&#xff0c;可能会导致网站加载缓慢、数据传输延迟甚至服务中断。网络延迟可能由多种原因引起&#xff0c;如硬件问题、网络配置错误、带宽不足或外部因素等。了解如何识别和解决这些问题对于确保服务器稳定性和提高用户体验至关重…

maven,java相关调试等

maven 增加调试信息的命令&#xff1a; mvn clean compile -Xmvn -X clean installmvn -e exec:execmodule jdk.compiler does not “opens com.sun.tools.java c.processing” 报错是因为用了JDK17&#xff0c;而老版本的1.18.4不支持。将lombok升级到1.18.32问题解决。 报错…

某物sign参数分析

某物&#xff0c;sign是在data加密中使用的一个参数&#xff0c;简单分析下。。 接下来以详情请求为例&#xff1a; 在这里下断点 跟进去之后可以看到一些字符串处理的逻辑 大概这样 用python还原以下得到 def before_md5_hash(search_params, key):sorted_items sorted(se…

香橙派--安装RKMPP、x264、libdrm、FFmpeg(支持rkmpp)以及opencv(支持带rkmpp的ffmpeg)(适用于RK3588平台)

1. 安装RKMPP git clone https://github.com/rockchip-linux/mppcd mpp/build/linux/aarch64./make-Makefiles.bashmake -j8sudo make installRKMPP&#xff1a;用于编解码测试&#xff0c;支持RK3588平台。 2. 安装x264 git clone https://code.videolan.org/videolan/x264…

计算机网络socket编程(4)_TCP socket API 详解

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(4)_TCP socket API 详解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&…

Android OpenGL ES详解——绘制圆角矩形

1、绘制矩形 代码如下&#xff1a; renderer类&#xff1a; package com.example.roundrectimport android.content.Context import android.opengl.GLES30 import android.opengl.GLSurfaceView.Renderer import com.opengllib.data.VertexArray import com.opengllib.prog…