C++中的代理模式

目录

代理模式(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.mzph.cn/pingmian/27806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫概述

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 网络爬虫&#xff08;又被称为网络蜘蛛、网络机器人&#xff0c;在某社区中经常被称为网页追逐者&#xff09;&#xff0c;可以按照指定的规则&#…

Sigir2024 ranking相关论文速读

简单浏览一下Sigir2024中与ranking相关的论文。不得不说&#xff0c;自从LLM大热后&#xff0c;传统的LTR方向的论文是越来越少了&#xff0c;目前不少都是RAG或类似场景下的工作了&#xff0c;比如查询改写、rerank等。 文章目录 The Surprising Effectiveness of Rankers Tr…

10分钟部署一个个人博客

关于vuepress这里没必要过多介绍&#xff0c;感兴趣的可以直接去官网了解&#xff0c;下面是官网首页地址截图 &#xff1a;https://v2.vuepress.vuejs.org/zh/ 透过这张图&#xff0c;我们也可以大致的对这个框架的特点有一定的认识&#xff0c;这就够了。其他的东西我们在使用…

Go TOKEN机制与跨域处理方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Web前端

1.HTML html语言就是一种标记语言&#xff0c;提供许多的标签&#xff0c;不同的标签功能不同&#xff0c;网页就是通过这些描述出来的。最终由浏览器 <!-- html注释 <!DOCTYPE html> 声明html语言的版本信息&#xff0c;为html5版本&#xff0c;告诉浏览器以html5…

亲测几十款随身wifi,全网最全随身WiFi避坑指南!最值得买的随随身wifi品牌推荐!

关于随身wifi我认为我是比较有发言权的&#xff0c;历经三年测评了几十种随身wifi&#xff0c;便宜的贵的&#xff0c;大牌的小厂的&#xff0c;电池款USB款等各种随身wifi。根据测试结果以及通过电商平台搜索、粉丝反馈、社交平台评价等综合测评结果。今天就跟大家分享一下&am…

设计模式-装饰器模式Decorator(结构型)

装饰器模式(Decorator) 装饰器模式是一种结构模式&#xff0c;通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能&#xff0c;是现有类的包装。 图解 角色 抽象组件&#xff1a;定义组件的抽象方法具体组件&#xff1a;实现组件的抽象方法抽象装饰器&…

Vue45-分析脚手架结构

一、脚手架项目结构一览 二、src、public文件夹外的文件 2-1、babel.config.js文件 详细的配置规格&#xff1a;babel官网。 2-2、package.json包的说明书 build命令&#xff1a;代码写完了&#xff0c;最后使用build命名构建整个工程&#xff0c;将其变成浏览器能够运行的项…

2024.6.14 作业 xyt

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c…

java:spring actuator添加自定义endpoint

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89437274 # 项目代码 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId&…

基于Matlab的人脸表情识别系统(GUI界面)【W5】

简介&#xff1a; 该系统是一个基于Matlab开发的人脸表情识别应用程序&#xff0c;旨在识别输入图像中的人脸表情&#xff0c;并通过直观的图形用户界面&#xff08;GUI&#xff09;向用户展示识别结果。系统结合了图像处理、机器学习和用户交互技术&#xff0c;使用户能够轻松…

第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.6.6 用as进行类型转换:显式而简洁的语法 贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prev和sum_of_two_dice都是u32类型,u32类型并不支持abs(…

Leetcode 力扣117. 填充每个节点的下一个右侧节点指针 II (抖音号:708231408)

给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#xff0c;所有 next 指针都…

讲透计算机网络知识(实战篇)01——计算机网络和协议

一、计算机网络和协议 1、网络和互联网络 1.1 网络、互联网、Internet 用交换机、集线器连接在一起的计算机构成一个网络。 用路由器连接多个网络&#xff0c;形成互联网。 全球最大的互联网&#xff1a;Internet。 1.2 网络举例 家庭互联网 图中的无线拨号路由器既是路由…

JAVAWEB--Mybatis02

Maven项目导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/…

【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 35&#xff0c;连休两天~ 题目详情 [134] 加油站 题目描述 134 加油站 解题思路 前提&#xff1a;数组 思路&#xff1a;全局贪心算法&#xff1a;最小累加剩余汽油为负数&#xff0c;说明…

师彼长技以助己(6)递归思维

师彼长技以助己&#xff08;6&#xff09;递归思维 递归思维-小游戏 思维小游戏 思维 小游戏&#xff1a;1 玩一个从1或2开始往上加的游戏&#xff0c;谁加到20就赢 如何保证一定赢呢&#xff1f;我们倒推&#xff0c;要先到20的话&#xff0c;谁先到17就赢&#xff0c;如此…

深入理解 Java 中的 synchronized 代码块

目录 前言 一、synchronized的工作原理 二、使用synchronized代码块的场景 三、编写synchronized代码块的最佳实践 四、何时使用 synchronized 代码块&#xff1f; 同步&#xff1a; 不同步&#xff1a; 五、Demo讲解 1.使用synchronized代码块减小锁的粒度&#xff0c…

勒索病毒剖析

2016年不自己勒索了 卖病毒 让别人勒索 傻瓜式勒索 黑客用的是非对称加密 全世界只有黑客有那把私钥 反向解密不了 传统爆破容易被检测&#xff0c;黑客慢速爆破&#xff0c;利用超级多的僵尸进行试错&#xff0c;慢慢试出来账号密码 因为一般运维设备在防火墙的白名单里&…

增值税发票OCR识别API在Java、Python、PHP中的使用教程

​增值税发票OCR识别是一种利用光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;自动提取和识别增值税发票上的文字信息的过程。增值税发票是企业在销售商品或提供服务过程中产生的一种税务凭证&#xff0c;包含了关键的财务信息&#xff0c;如商品明细、金额、税率等…