C++中的代理模式

server/2024/9/23 16:02:40/

目录

代理模式(Proxy Pattern)

实际应用

虚拟代理

远程代理

访问控制代理

总结


代理模式(Proxy Pattern)

代理模式是一种结构型设计模式,它提供了一个代理对象,充当了被访问对象的接口,使得客户端可以通过代理对象间接访问被访问对象。代理模式可以用于控制对被访问对象的访问,以及在访问被访问对象前后执行一些额外的操作。

实际应用

虚拟代理

假设有一个复杂的图片加载器,加载图片可能会耗费大量时间和内存,这个时候我们可以使用虚拟代理来延迟图片的加载,只有当图片真正需要显示时才进行加载。

#include <iostream>
#include <string>
#include <memory>// 图片接口
class Image {
public:virtual void display() = 0;
};// 具体实现:图片加载器
class RealImage : public Image {
private:std::string filename;
public:RealImage(const std::string& filename) : filename(filename) {loadFromDisk();}void display() override {std::cout << "Displaying image: " << filename << "\n";}void loadFromDisk() {std::cout << "Loading image: " << filename << "\n";}
};// 代理类:虚拟代理
class ImageProxy : public Image {
private:std::string filename;std::shared_ptr<RealImage> realImage;
public:ImageProxy(const std::string& filename) : filename(filename), realImage(nullptr) {}void display() override {if (!realImage) {realImage = std::make_shared<RealImage>(filename);}realImage->display();}
};int main() {std::shared_ptr<Image> image = std::make_shared<ImageProxy>("example.jpg");// 图片加载延迟到需要显示时image->display();// 第二次显示时不会重新加载图片image->display();return 0;
}

远程代理

假设有一个远程服务,客户端通过网络与该服务通信,这时候可以使用远程代理来隐藏网络通信的细节,并提供一个与本地对象相同的接口。

#include <iostream>
#include <string>// 服务接口
class RemoteService {
public:virtual void request(const std::string& data) = 0;
};// 具体实现:远程服务
class ConcreteRemoteService : public RemoteService {
public:void request(const std::string& data) override {std::cout << "Sending request to remote server with data: " << data << "\n";// 发送请求到远程服务器并接收响应}
};// 代理类:远程代理
class RemoteServiceProxy : public RemoteService {
private:std::shared_ptr<ConcreteRemoteService> service;
public:RemoteServiceProxy() : service(std::make_shared<ConcreteRemoteService>()) {}void request(const std::string& data) override {// 在发送请求前可以执行一些额外的操作std::cout << "Proxy: Preparing request...\n";// 转发请求给真实的服务对象service->request(data);// 在接收响应后可以执行一些额外的操作std::cout << "Proxy: Processing response...\n";}
};int main() {std::shared_ptr<RemoteService> proxy = std::make_shared<RemoteServiceProxy>();proxy->request("Some data");return 0;
}

访问控制代理

假设有一个需要访问控制的对象,只有具有特定权限的用户才能访问。访问控制代理可以用来控制对对象的访问。

#include <iostream>
#include <string>// 受保护对象
class ProtectedResource {
private:std::string data;
public:ProtectedResource(const std::string& data) : data(data) {}void access(const std::string& user) {if (user == "admin") {std::cout << "Accessing resource: " << data << "\n";} else {std::cout << "Access denied for user: " << user << "\n";}}
};// 代理类:访问控制代理
class AccessControlProxy {
private:std::shared_ptr<ProtectedResource> resource;
public:AccessControlProxy(const std::string& data) : resource(std::make_shared<ProtectedResource>(data)) {}void access(const std::string& user) {resource->access(user);}
};int main() {AccessControlProxy proxy("Sensitive data");proxy.access("user");proxy.access("admin");return 0;
}

总结

代理模式可以在不同的场景中使用,包括延迟加载、隐藏远程调用细节和访问控制等。同时,代理模式也可以帮助我们控制对对象的访问,并在访问对象前后执行一些额外的操作。


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

相关文章

数据结构之线性表(4)

前面我们了解到线性表中的顺序表、链表等结构&#xff0c;今天我们探讨新的一种线性表——栈。 那么我们开始栈的探讨之旅吧。 1.栈的基本概念 1.1栈&#xff08;Stack&#xff09;&#xff1a; 是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定…

Servlet基础(续集2)

HttpServletResponse web服务器接收到客户端的http的请求&#xff0c;针对这个请求&#xff0c;分别创建一个代表请求的HttpServletRequest对象&#xff0c;代表响应的一个HttpServletResponse 如果要获取客户端请求过来的参数&#xff1a;找HttpServletRequest如果要给客户端…

【Linux】I/O多路复用

文章目录 I/O多路复用select()select()缺点 poll()poll()缺点 epoll()LT(水平触发模式)ET(边缘触发模式)具体函数 I/O多路复用 多进程和多线程实现并发会消耗大量的资源&#xff0c;主进程/线程用于监听和接受连接&#xff0c;再创建多个子进程/子线程来完成与连接的各个客户端…

阅读论文(十)

论文题目:A novel approach for intelligent diagnosis and grading of diabetic retinopathy 中文题目:一种新的糖尿病视网膜病变智能诊断和分级方法 0摘要 糖尿病视网膜病变(DR)是糖尿病的一种严重的眼部并发症,可导致视力损害甚至失明。目前,传统的深度卷积神经网络…

第5天:Flask应用结构

第5天&#xff1a;Flask应用结构 Flask应用结构简介 随着应用的增长&#xff0c;合理地组织代码变得非常重要。一个清晰的应用结构可以帮助你更有效地管理项目&#xff0c;提高代码的可读性和可维护性。 基本结构 一个典型的Flask应用结构可能包括以下部分&#xff1a; /y…

如何挑选优质的气膜建筑生产厂家—轻空间

随着气膜建筑在各个领域的应用越来越广泛&#xff0c;市场上出现了众多气膜建筑生产厂家。为了确保您选择到高质量的产品和可靠的服务&#xff0c;以下是一些在挑选气膜建筑生产厂家时需要考虑的重要因素。 1. 经验与专业知识 厂家的经验是评估其能力和信誉的重要指标。选择具有…

频率域,空间域以及频率域和空间域如何获取

文章目录 频率域频率域的关键概念&#xff1a;频率域的应用&#xff1a; 空间域空间域特征的含义&#xff1a;空间域操作的常见技术&#xff1a;与频率域的对比&#xff1a; 如何获取空间域&#xff0c;频率域空间域特征&#xff1a;频率域特征&#xff1a; 频率域 频率域&…

SpringBoot:SpringBoot中使用Redisson实现分布式锁

一、前言 Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。 刚好项目中需要使用到分布式锁&#xff0c;记录一下Redisson是如何使用分布式…