C++ 设计模式-代理模式

server/2025/2/23 2:36:27/

远程代理(Remote Proxy)示例

假设有一个服务器应用程序,该应用程序提供了一个服务,比如获取用户信息。客户端直接访问远程对象可能很复杂,因此可以使用代理对象来简化这个过程。代理对象将请求转发给远程对象,远程对象负责真正的服务逻辑。

设计:
  1. Subject:定义了客户端和代理对象以及真实对象都共享的接口。
  2. RealSubject:实现了具体的服务操作,比如从远程数据库获取数据。
  3. Proxy:在客户端和远程对象之间起到中介作用,负责请求的转发。
代码示例:
#include <iostream>
#include <string>
#include <memory>// 定义Subject接口
class UserService {
public:virtual void getUserInfo(int userId) = 0;virtual ~UserService() = default;
};// 真实的UserService类,它提供了从远程数据库获取用户信息的功能
class RealUserService : public UserService {
public:void getUserInfo(int userId) override {std::cout << "Fetching user info from remote server for user ID: " << userId << std::endl;}
};// 代理类,它充当客户端和远程服务之间的中介
class ProxyUserService : public UserService {
private:std::shared_ptr<RealUserService> realUserService;bool isAuthenticated;public:ProxyUserService() : realUserService(nullptr), isAuthenticated(false) {}// 设置认证信息void authenticate(const std::string& token) {if (token == "valid_token") {isAuthenticated = true;std::cout << "Authentication successful!" << std::endl;} else {std::cout << "Authentication failed!" << std::endl;}}void getUserInfo(int userId) override {// 代理对象在此控制对真实对象的访问权限if (isAuthenticated) {if (!realUserService) {realUserService = std::make_shared<RealUserService>();}realUserService->getUserInfo(userId);} else {std::cout << "Access denied. Please authenticate first." << std::endl;}}
};int main() {// 创建代理对象ProxyUserService proxyService;// 尝试访问真实服务,未认证proxyService.getUserInfo(101);// 用户认证proxyService.authenticate("valid_token");// 认证后,访问真实服务proxyService.getUserInfo(101);return 0;
}

解释:

  1. UserService 是一个接口,声明了客户端和代理对象都需要实现的方法。getUserInfo 方法是要调用的远程服务。
  2. RealUserService 是实际的远程服务,它执行从数据库或服务器获取用户信息的逻辑。
  3. ProxyUserService 是代理类,它负责客户端与真实服务之间的交互,提供认证功能,确保只有经过认证的用户才能访问真实的服务。

代理模式的复杂性:

  • 延迟加载ProxyUserService 会在首次请求时创建 RealUserService 对象,避免了不必要的远程服务调用。
  • 认证控制:在代理中添加了访问控制,确保只有通过认证的用户可以访问真实服务。它模拟了一个实际的安全机制。
  • 远程通信:虽然此示例并未直接涉及网络编程,但可以将 RealUserService 替换为通过网络与远程服务器通信的代码,进而实现真正的远程服务访问。

经典场景:

  • 分布式系统:远程代理可以作为客户端与远程服务之间的中介,简化客户端对远程服务的调用。
  • 访问控制:保护代理在许多应用中用于控制对敏感资源的访问,比如数据库访问,确保只有授权用户可以执行特定操作。

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

相关文章

Airtest与持续集成(CI)工具的集成实操案例

在现代软件开发流程中&#xff0c;自动化测试和持续集成&#xff08;CI&#xff09;工具的结合已经成为不可或缺的部分。Airtest作为一款优秀的自动化测试工具&#xff0c;结合持续集成&#xff08;CI&#xff09;工具&#xff0c;可以大大提升测试效率和开发质量。本文将详细介…

Python爬虫-猫眼电影的影院数据

前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以猫眼电影为例子,获取猫眼的影院相关数据。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) …

微信小程序通过http通信控制庐山派

首先要形成同一个局域网才能够实现 这是微信小程序的代码 Page({ data: { isConnected: false, // WiFi连接状态 serverUrl: http://192.168.1.225:8081/command // 服务器地址 }, onLoad() { this.authorizeLocation(); }, // 授权地理位置 authorizeLocation() { wx.author…

ubuntu22.04离线安装K8S

1. 准备离线安装包 参考教程离线包准备教程 2. 准备环境 2.1. 准备主机 主机名ip系统k8s-master192.168.38.128ubuntu22.04k8s-node192.168.38.131ubuntu22.04 2.2. 设置host 修改 /etc/hosts 文件&#xff0c;添加master和node节点&#xff0c;需要和主机名保持一致 2…

若依-@Excel新增注解numberFormat

Excel注解中原本的scale会四舍五入小数&#xff0c;导致进度丢失 想要的效果 显示的时候保留两个小数真正的数值是保留之前的数值 还原过程 若以中有一個專門的工具类&#xff0c;用来处理excel的 找到EXCEL导出方法exportExcel()找到writeSheet,写表格的方法找到填充数据的方法…

信创浪潮下,以 OpManager筑牢安全运维防线

在数字化转型加速和国际形势复杂多变的当下&#xff0c;信创产业的重要性愈发凸显。信创&#xff0c;即信息技术应用创新&#xff0c;旨在实现信息技术领域的自主可控&#xff0c;涵盖从芯片、操作系统、数据库到应用软件等一系列关键技术和产品。它不仅是推动产业升级的重要力…

微软宣布 Windows 11 将不再免费升级:升级需趁早

大家都知道如果你现在是Windows 10 系统&#xff0c;其实可以免费升级到正版 Windows 11&#xff0c;只要你的电脑配置满足 TPM2.0要求。 而最近微软已经公布了 Windows 10 的最后支持时间&#xff0c;也就是今年10月14日&#xff0c;在这之后微软将不再对Windows 10负责&#…

IntelliJ IDEA 控制台输出中文出现乱码

IntelliJ IDEA 控制台输出中文出现乱码通常是由于编码设置不一致导致的。以下是常见原因及解决方法 1. 项目编码设置 检查路径&#xff1a;File → Settings → Editor → File Encodings 确保 Project Encoding、Global Encoding 和 Default Encoding for Properties Files 均…