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

代理模式 - 代理模式的应用

引言

代理模式(Proxy Pattern)是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用,从而可以在不改变目标对象的情况下,增加额外的功能或控制访问。本文将详细介绍如何在C++中实现代理模式,并通过示例代码帮助读者理解其应用场景。

代理模式的基本概念

代理模式的核心思想是通过引入一个代理对象来控制对目标对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用,从而可以在不改变目标对象的情况下,增加额外的功能或控制访问。

代理模式的角色

  1. Subject(抽象主题):定义目标对象和代理对象的共同接口,这样代理对象可以在任何地方替代目标对象。
  2. RealSubject(真实主题):定义目标对象,它是代理对象所代表的真实对象。
  3. Proxy(代理):包含一个指向真实主题的引用,并实现与真实主题相同的接口。代理对象可以在调用真实主题的方法前后执行一些额外的操作。

C++实现代理模式

1. 定义抽象主题类

首先,我们定义一个抽象主题类 Subject,它包含目标对象和代理对象的共同接口。

#include <iostream>
#include <memory>// 抽象主题类
class Subject {
public:virtual ~Subject() = default;virtual void request() const = 0;
};

2. 定义真实主题类

接下来,我们定义一个真实主题类 RealSubject,它继承自 Subject 并实现 request 方法。

// 真实主题类
class RealSubject : public Subject {
public:void request() const override {std::cout << "RealSubject: Handling request." << std::endl;}
};

3. 定义代理类

然后,我们定义一个代理类 Proxy,它也继承自 Subject,并实现 request 方法。代理类中包含一个指向真实主题的引用,并在调用真实主题的方法前后执行一些额外的操作。

// 代理类
class Proxy : public Subject {
public:Proxy(std::shared_ptr<RealSubject> real_subject) : real_subject_(real_subject) {}void request() const override {if (checkAccess()) {real_subject_->request();logAccess();}}private:bool checkAccess() const {std::cout << "Proxy: Checking access prior to firing a real request." << std::endl;return true;}void logAccess() const {std::cout << "Proxy: Logging the time of request." << std::endl;}std::shared_ptr<RealSubject> real_subject_;
};

4. 使用代理模式

最后,我们通过一个简单的示例来演示如何使用代理模式。

int main() {// 创建真实主题对象auto real_subject = std::make_shared<RealSubject>();// 创建代理对象auto proxy = std::make_shared<Proxy>(real_subject);// 通过代理对象调用请求proxy->request();return 0;
}

5. 运行结果

运行上述代码,输出结果如下:

Proxy: Checking access prior to firing a real request.
RealSubject: Handling request.
Proxy: Logging the time of request.

代理模式的应用场景

代理模式在实际开发中有广泛的应用,以下是一些常见的应用场景:

  1. 远程代理:为一个位于不同地址空间的对象提供一个本地代表。例如,客户端可以通过远程代理访问远程服务器上的对象。
  2. 虚拟代理:根据需要创建开销很大的对象。例如,在加载大图片时,可以使用虚拟代理来延迟图片的加载,直到真正需要显示图片时才加载。
  3. 保护代理:控制对原始对象的访问权限。例如,可以在代理对象中检查客户端的权限,只有具有相应权限的客户端才能访问目标对象。
  4. 智能引用:在访问对象时执行一些额外的操作。例如,可以在代理对象中记录对象的访问次数,或者在对象被释放时自动释放相关资源。

总结

代理模式通过引入一个代理对象来控制对目标对象的访问,从而可以在不改变目标对象的情况下,增加额外的功能或控制访问。这种模式在处理远程对象、延迟加载、权限控制等场景时非常有用。通过本文的示例代码,读者可以更好地理解如何在C++中实现代理模式,并将其应用到实际项目中。

希望本文对你理解代理模式有所帮助!如果你有任何问题或建议,欢迎在评论区留言讨论。

相关文章:

代理模式 - 代理模式的应用

引言 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用&#xff0c;从而可以在不改变目标对象的情况下&#xff0c;增加额外的功能或控…...

DeepSeek超越ChatGPT的能力及部分核心原理

DeepSeek超越ChatGPT的能力及部分核心原理 目录 DeepSeek超越ChatGPT的能力及部分核心原理超越ChatGPT的能力核心原理超越ChatGPT的能力 推理计算能力更强:在复杂的数学计算、法律文件审查等任务中,DeepSeek的推理能力可媲美甚至超越部分国际顶尖AI模型,包括ChatGPT。例如在…...

【4Day创客实践入门教程】Day3 实战演练——桌面迷你番茄钟

Day3 实战演练——桌面迷你番茄钟 目录 Day3 实战演练——桌面迷你番茄钟1. 选择、准备元件、收集资料2. 硬件搭建3.编写代码 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机与MicroPython初步Day3 实战演练——桌面迷你番茄钟…...

Git 出现 Please use your personal access token instead of the password 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 1. 问题所示 执行Git提交代码的时候,出现如下所示: lixiaosong@IT07 MINGW64 /f/java_project/JavaDemo (master) $ git push -u origin --all libpng warning: iCCP: known incorrect sRGB profile libpng warning...

LeetCode题练习与总结:不含连续1的非负整数--600

一、题目描述 给定一个正整数 n &#xff0c;请你统计在 [0, n] 范围的非负整数中&#xff0c;有多少个整数的二进制表示中不存在 连续的 1 。 示例 1: 输入: n 5 输出: 5 解释: 下面列出范围在 [0, 5] 的非负整数与其对应的二进制表示&#xff1a; 0 : 0 1 : 1 2 : 10 3 :…...

AndroidCompose Navigation导航精通1-基本页面导航与ViewPager

文章目录 前言基本页面导航库依赖导航核心部件简单NavHost实现ViewPagerPager切换逻辑图阐述Pager导航实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来…...

【环境搭建】1.1源码下载与同步

目录 写在前面 一&#xff0c;系统要求 二&#xff0c;安装depot_tools 三&#xff0c;获取代码 四&#xff0c;代码同步 五&#xff0c;代码结构 写在前面 当前的开发背景是基于Google的开源Chromium&#xff0c;来开发Android设备的浏览器方案。 一&#xff0c;系统要…...

Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)

python | OpenCV小记&#xff08;一&#xff09;&#xff1a;cv2.imread&#xff08;f&#xff09;读取图像操作 1. 为什么 [:, :, 0] 提取的是第一个通道&#xff08;B 通道&#xff09;&#xff1f;OpenCV 的通道存储格式索引操作 [:, :, 0] 的解释常见误解 1. 为什么 [:, :,…...

C语言指针专题四 -- 多级指针

目录 1. 多级指针的核心原理 1. 多级指针的定义 2. 内存结构示意图 3. 多级指针的用途 2. 编程实例 实例1&#xff1a;二级指针操作&#xff08;修改一级指针的值&#xff09; 实例2&#xff1a;动态二维数组&#xff08;二级指针&#xff09; 实例3&#xff1a;三级指…...

本地部署 DeepSeek-R1 大模型

本地部署 DeepSeek-R1 大模型指南 1. 引言 1.1 DeepSeek-R1 模型简介 在人工智能的世界里&#xff0c;大型语言模型&#xff08;LLM&#xff09;正如一座巨大的宝库&#xff0c;里面储存着丰富的信息和无限的潜力。而DeepSeek-R1&#xff0c;就像那扇打开智慧之门的钥匙。它…...

深度学习的应用

目录 一、机器视觉 1.1 应用场景 1.2 常见的计算机视觉任务 1.2.1 图像分类 1.2.2 目标检测 1.2.3 图像分割 二、自然语言处理 三、推荐系统 3.1 常用的推荐系统算法实现方案 四、图像分类实验补充 4.1 CIFAR-100 数据集实验 实验代码 4.2 CIFAR-10 实验代码 深…...

想学习Python编程,应该如何去学习呢

学习Python编程是一个循序渐进的过程&#xff0c;以下是一个详细的学习路径和建议&#xff1a; 一、基础入门 安装Python环境&#xff1a; 从Python官方网站下载并安装适合你操作系统的Python版本。确保将Python添加到系统路径中&#xff0c;以便在命令行中方便地访问。 学习…...

RabbitMQ 多种安装模式

文章目录 前言一、Windows 安装 RabbitMq1、版本关系2、Erlang2.1、下载安装 Erlang 23.12.2、配置 Erlang 环境变量 3、RabbitMQ3.1、下载安装 RabbitMQ 3.8.93.2、环境变量3.3、启动RabbitMQ 管理插件3.3、RabbitMQ3.4、注意事项 二、安装docker1、更新系统包&#xff1a;2、…...

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...

《DeepSeek-R1 问世,智能搜索领域迎来新变革》

DeepSeek-R1是由DeepSeek公司开发的一款创新型人工智能模型&#xff0c;自2024年5月7日发布以来&#xff0c;迅速在AI领域引起广泛关注。该模型凭借其卓越的语言理解能力、高效的数据处理能力、自适应学习能力、高安全性与可靠性以及广泛的应用场景与拓展性&#xff0c;在众多人…...

深入解析 Linux 内核中的页面错误处理机制

在现代操作系统中,页面错误(Page Fault)是内存管理的重要组成部分。当程序试图访问未映射到物理内存的虚拟内存地址时,CPU 会触发页面错误异常。Linux 内核通过一系列复杂的机制来处理这些异常,确保系统的稳定性和性能。本文将深入解析 Linux 内核中处理页面错误的核心代码…...

Java手写简单Merkle树

Java手写Merkle树代码 package com.blockchain.qgy.component;import com.blockchain.qgy.model.MerkleTreeNode; import com.blockchain.qgy.util.SHAUtil;import java.util.*;public class MerkleTree<T> {//merkle树private List<MerkleTreeNode<T>> lis…...

DDD - 微服务架构模型_领域驱动设计(DDD)分层架构 vs 整洁架构(洋葱架构) vs 六边形架构(端口-适配器架构)

文章目录 引言1. 概述2. 领域驱动设计&#xff08;DDD&#xff09;分层架构模型2.1 DDD的核心概念2.2 DDD架构分层解析 3. 整洁架构&#xff1a;洋葱架构与依赖倒置3.1 整洁架构的核心思想3.2 整洁架构的层次结构 4. 六边形架构&#xff1a;解耦核心业务与外部系统4.1 六边形架…...

数据结构与算法之二叉树: LeetCode LCP 10. 二叉树任务调度 (Ts版)

二叉树任务调度 https://leetcode.cn/problems/er-cha-shu-ren-wu-diao-du/description/ 描述 任务调度优化是计算机性能优化的关键任务之一。在任务众多时&#xff0c;不同的调度策略可能会得到不同的总体执行时间&#xff0c;因此寻求一个最优的调度方案是非常有必要的 通…...

在AWS上使用KMS客户端密钥加密S3文件,同时支持PySpark读写和Snowflake导入

现有AWS EMR集群上运行PySpark代码&#xff0c;可以读写S3上的数据文件&#xff0c;Snowflake数据仓库也需要导入S3上的文件到表。现在要用AWS KMS有客户端密钥加密S3上的文件&#xff0c;同时允许PySpark代码&#xff0c;可以读写S3上的数据文件&#xff0c;Snowflake数据仓库…...

玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...

如何进行API版本控制?

一、URI路径版本控制(Path Versioning) 通过在API的URL路径中包含版本号来实现。例如: /api/v1/products /api/v2/products 这种方法最为直观,用户可以根据URL判断版本。它的优点是简单易懂,容易实现。但如果接口变动频繁,可能会导致大量的路径不同版本的接口需要维护…...

计算机毕业设计Python+CNN卷积神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

### 2024 江西省赛题解(A,C,D,G,H,J,K,L) BEFI待补

A. 输出 a b c abc abc 即可。 void slove () {int a, b, c;cin >> a >> b >> c;cout << (a b c) << endl; }B. C. 如果 ∑ i 1 n a i S \sum_{i1}^{n}a_iS ∑i1n​ai​S 那么存在所有人说的都是真话的可能。 否则&#xff0c;我们…...

Ruby 类和对象

Ruby 类和对象 引言 在软件开发中,类和对象是面向对象编程(OOP)的核心概念。Ruby 作为一种动态、解释型编程语言,也以简洁的方式支持面向对象编程。本文将深入探讨 Ruby 中的类和对象,包括它们的定义、创建、使用以及一些高级特性。 类与对象的定义 类 在 Ruby 中,类…...

【自学笔记】JavaWeb的重点知识点-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 JavaWeb知识点一、基础概念二、项目结构三、Tomcat服务器四、数据库连接&#xff08;JDBC&#xff09;五、前端技术六、高级技术 总结 以下是JavaWeb知识点的MD格式…...

OpenCV:闭运算

目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;开运算-CSDN博客 1. 简述…...

智云-一个抓取web流量的轻量级蜜罐-k8s快速搭建教程

智云-一个抓取web流量的轻量级蜜罐-k8s快速搭建教程 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN k8s搭建教程 首先下载代码文件 git clone https://github.com/xiaoxiaoranxxx/POT-ZHIYUN.git cd POT-ZHIYUN编译镜像 代码相关文件在github https://github.com/x…...

万物皆有联系:驼鸟和布什

布什&#xff1f;一块布十块钱吗&#xff1f;不是&#xff0c;大家都知道&#xff0c;美国有两个总统&#xff0c;叫老布什和小布什&#xff0c;因为两个布什总统&#xff08;父子俩&#xff09;&#xff0c;大家就这么叫来着&#xff0c;目的是为了好区分。 布什总统的布什&a…...