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

server/2025/2/2 18:35:43/

引言

代理模式(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++中实现代理模式,并将其应用到实际项目中。

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


http://www.ppmy.cn/server/164402.html

相关文章

MySQL知识点总结(十七)

在从属服务器上执行RESET SLAVE命令时&#xff0c;会发生哪些操作&#xff1f; RESET SLAVE命令会断开从属服务器与主服务器的连接&#xff0c;以重置从属服务器&#xff0c;具体效果如下&#xff1a;清除 master.info和relay.log资料档案库删除所有中继日志启动新的中继日志文…

基于FPGA的BT656编解码

概述 BT656全称为“ITU-R BT.656-4”或简称“BT656”,是一种用于数字视频传输的接口标准。它规定了数字视频信号的编码方式、传输格式以及接口电气特性。在物理层面上,BT656接口通常包含10根线(在某些应用中可能略有不同,但标准配置为10根)。这些线分别用于传输视频数据、…

LLaMA-Factory 微调LLaMA3

LoRA介绍 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于大模型微调的技术&#xff0c; 通过引入低秩矩阵来减少微调时的参数量。在预训练的模型中&#xff0c; LoRA通过添加两个小矩阵B和A来近似原始的大矩阵ΔW&#xff0c;从而减 少需要更新的参数数量。具体来…

Flask 使用Flask-SQLAlchemy操作数据库

username db.Column(db.String(64), uniqueTrue, indexTrue); password db.Column(db.String(64)); 建立对应关系 如果是多对多关系就建一张表&#xff0c;关联两个表的id role_id db.Column(db.Integer, db.ForeignKey(‘roles.id’)) ‘’’ 帮助作关联查询 relati…

FPGA 使用 CLOCK_LOW_FANOUT 约束

使用 CLOCK_LOW_FANOUT 约束 您可以使用 CLOCK_LOW_FANOUT 约束在单个时钟区域中包含时钟缓存负载。在由全局时钟缓存直接驱动的时钟网段 上对 CLOCK_LOW_FANOUT 进行设置&#xff0c;而且全局时钟缓存扇出必须低于 2000 个负载。 注释&#xff1a; 当与其他时钟约束配合…

STM32 中断系统

目录 中断 定义&#xff1a; 中断处理的过程&#xff1a; 1.中断申请&#xff1a; 2.中断响应&#xff1a; 3.中断处理&#xff1a; 4.中断向量 : 5.中断返回&#xff1a; 中断优先级 1.抢占优先级 2.响应优先级 3.自然优先级 中断嵌套 中断执行流程 中断源 NV…

debian12.9编译freeswitch1.10.12【默认安装】

服务器操作系统 cat /etc/os-release PRETTY_NAME"Debian GNU/Linux 12 (bookworm)" NAME"Debian GNU/Linux" VERSION_ID"12" VERSION"12 (bookworm)" VERSION_CODENAMEbookworm IDdebian HOME_URL"https://www.debian.org/&quo…

【Postman接口测试】Postman的全局变量和环境变量设置

在使用Postman进行接口测试时&#xff0c;全局变量和环境变量的设置是非常实用的功能&#xff0c;它们可以帮助我们更高效地管理测试数据和配置&#xff0c;提高测试的灵活性和可维护性。接下来&#xff0c;我们将详细介绍Postman中全局变量和环境变量的设置方法&#xff0c;并…