C++设计模式——Proxy代理模式

一,代理模式简介

代理模式是一种 结构型设计模式,该模式通过引入一个新的代理对象Proxy,来间接访问原始对象,从而使访问方式变得灵活和可控。
代理对象的设定减少了客户端与真实对象之间的直接交互。
通过引入代理对象来间接访问原始的对象,达到延迟访问和隔离的效果,这就是代理模式的主要用途。
举个例子:
当有多个客户端对数据库发起大批量请求时,数据库由于需要同时处理多个请求,导致其处理速度变得很慢。
此时如果有一个代理,用法上和数据库一致,这个代理先收集来自多个客户端的请求,进行缓存,然后逐渐转发给数据库,避免了通道发生阻塞,那么数据库此时的处理速度会大大提升。

二,代理模式的结构

1.抽象对象(Subject):定义了真实对象和代理对象的共同接口。

2.真实对象(RealSubject):又称为被代理对象,代理模式中的核心角色,定义了真正需要被代理的业务逻辑。

3.代理对象(Proxy):充当了客户端与真实对象之间的中介。

对应UML类图:

1.Subject定义了Proxy和RealSubject的公共接口。

2.Proxy和RealSubject都实现了Subject的接口。

3.客户端(Client)通过Proxy与RealSubject进行交互。

4.RealSubject负责完成主要的接口实现,Proxy负责控制外部Client对接口的访问。

5.Proxy内部包含对Subject的对象指针或引用,因此Proxy可以进一步调用子类RealSubject中的函数(forward calls)。

6.在某些情况下,Proxy可以用来完成RealSubject实例的创建与销毁。

7.Client是使用Proxy的对象,它通过Proxy来访问和操作RealSubject。

代码实现:

#include <iostream>
using namespace std;class Subject
{
public:virtual void request() = 0;virtual ~Subject() {}
};class RealSubject : public Subject
{
public:void request() {cout << "RealSubject.request()" << endl;}
};class Proxy : public Subject
{
private:Subject* realSubject;
public:Proxy(){realSubject = new RealSubject();}~Proxy(){delete realSubject;}// Forward calls to the RealSubject:void request() {realSubject->request();}
};int main() {Proxy p;p.request();
}

运行结果:

RealSubject.request()

补充:在C++编码中,确实可以通过继承和虚函数实现父类调用子类的成员函数,这是C++多态特性的一种常见应用方式。

#include <iostream>
using namespace std;class Base {
public:virtual void print() { cout << "Base class method" << endl; }
};class Derived : public Base {
public:// 重写父类的虚函数virtual void print() override { cout << "Derived class method" << endl;  }
};int main() {// 父类对象调用子类方法Base* baseObj = new Derived();baseObj->print();
}

运行结果:

Derived class method

三,代理模式的种类

简单代理(Simple Proxy):主要用于转发请求和处理一些基本操作,例如添加日志、计时等。

远程代理(Remote Proxy):当主体对象在另一个地址空间(如网络地址)时,远程代理会提供远程通信的功能,进行数据的访问和转换。

智能引用代理(Smart Reference Proxy):也称为共享代理,它维护了多个客户端对同一目标的共享引用,并提供统一的接口。

虚拟代理(Virtual Proxy):延迟针对昂贵资源的访问,只有在真正使用时才加载。

保护代理(Protection Proxy):主要用于访问权限的控制,比如身份验证、授权等。

四,代理模式的应用场景

1.延迟加载:使资源密集型的对象仅仅在被使用时才加载,例如,访问大型数据库、加载大批量图像数据等。

2.访问控制:代理可以通过添加身份验证来控制对真实主体的访问,可用于保护敏感数据。

3.缓存机制:代理可以缓存高频次的请求,从而减少系统开销,优化性能。

4.日志记录和监控:代理可用于记录或监控对真实主体执行的操作,而无需修改其代码。

5.远程访问:在分布式系统中,真实主体可能位于不同的计算机上,代理模式可以隐藏远程通信的复杂细节。

6.状态管理:代理可以同步管理多个客户端所共享的真实主体的状态,确保它们的一致性。

五,代理模式的优缺点

代理模式的优点:

可以在不修改被代理对象的情况下,增加额外的功能或控制访问方式。

可以在访问对象之前和之后进行一些处理,比如添加日志、添加时间戳等。

可以实现远程代理,使得客户端可以通过网络访问远程的对象。

可以防止未经授权访问真实主体。

代理模式的缺点:

引入新的类,增加代码复杂性。

读取资源时,需要通过代理来间接访问,造成额外的性能损失。

六,代码实战

开发场景:基于Proxy模式来模拟对图片的延迟加载和显示控制。

1.创建Subject

//Step 1: Define the Subject interface
class Image {
public:virtual void display() = 0;
};

2.创建RealSubject

//Step 2: Implement the Real Object
class RealImage : public Image {
private:std::string filename;
public:RealImage(const std::string& filename) : filename(filename) {// Simulate loading the imagestd::cout << "Loading image: " << filename << std::endl;}void display() override {std::cout << "Displaying image: " << filename << std::endl;}
};

3.Proxy类实现与RealSubject相同的接口,并维护对RealSubject的引用。

//Step 3: Create the Proxy
class ImageProxy : public Image {
private:// Reference to the Real ObjectRealImage* realImage;std::string filename;public:ImageProxy(const std::string& filename) : filename(filename), realImage(nullptr) {}void display() override {if (realImage == nullptr) {realImage = new RealImage(filename);}realImage->display();}
};

完整代码实现:

#include <iostream>
#include <bits/stdc++.h>using namespace std;
class Image {
public:virtual void display() = 0;
};class RealImage : public Image {
private:std::string filename;
public:RealImage(const std::string& filename) : filename(filename) {// Simulate loading the imagestd::cout << "Loading image: " << filename << std::endl;}void display() override {std::cout << "Displaying image: " << filename << std::endl;}
};class ImageProxy : public Image {
private:// Reference to the Real ObjectRealImage* realImage; std::string filename;public:ImageProxy(const std::string& filename) : filename(filename), realImage(nullptr) {}void display() override {if (realImage == nullptr) {realImage = new RealImage(filename);}realImage->display();}
};int main() {//Create a proxy to an imageImage* image = new ImageProxy("example.jpg");//Display the imageimage->display();//Displaying the image againimage->display();delete image;return 0;
}

运行结果:

Loading image: example.jpg
Displaying image: example.jpg
Displaying image: example.jpg

七,参考阅读

https://www.geeksforgeeks.org/proxy-pattern-c-design-patterns/

https://www.bogotobogo.com/DesignPatterns/proxy.php

https://design-patterns.readthedocs.io/zh-cn/latest/structural_patterns/proxy.html

https://refactoring.guru/design-patterns/proxy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26910.shtml

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

相关文章

农资投入品系统架构:数字化农业的技术支撑与创新

在当今数字化时代&#xff0c;农业领域也在迅速迈向数字化和智能化的新阶段。农资投入品系统作为农业生产的重要支撑&#xff0c;其系统架构的设计与创新对于提高农业生产效率、保障粮食安全具有重要意义。本文将探讨农资投入品系统架构的设计原则、核心模块以及未来发展趋势。…

OrangePi AIpro测评:性能、应用与开发者体验解析

一、OrangePi AIpro介绍 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&#xff0c;支持双4K高…

AI虚拟试穿技术:开启高保真、多场景、多样化服装组合的试穿应用

随着电子商务的快速发展,消费者对于在线购物体验的要求越来越高。特别是在服装领域,消费者渴望能够在购买前直观地了解服装的试穿效果。传统的虚拟试穿技术虽然已有一定的发展,但在不同场景下的高保真度和鲁棒性方面仍面临挑战。为此,我们研发了一种全新的AI虚拟试穿技术,…

2.spring cloud gateway 源码编译

spring cloud gateway编译 1.编译 命令 mvn clean compile -U2.报错 报错信息 核心信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.1.2:check (checkstyle-validation) on project spring-cloud-gateway-mvc: Failed during …

【分布式技术专题】「OceanBase深度解析」 探索OceanBase产品矩阵与核心设计

探索OceanBase产品矩阵与核心设计 OceanBase的六大特性高扩展高可用多租户&#xff08;资源隔离&#xff09;OceanBase架构和功能OceanBase广泛的数据源支持 OceanBase的六大特性 OceanBase以其卓越的产品平台整合方案&#xff0c;充分展现了六大核心特性的卓越与全面。这一方…

C++ | Leetcode C++题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {int n tokens.size();vector<int> stk((n 1) / 2);int index -1;for (int i 0; i < n; i) {string& token tokens[i];if (token.length() >…

人工智能将成为数学家的“副驾驶”

人工智能将成为数学家的“副驾驶” 数学传统上是一门独立的科学。1986年&#xff0c;安德鲁怀尔斯为了证明费马定理&#xff0c;退到书房里呆了7年。由此产生的证明往往很难让同事们理解&#xff0c;有些至今仍有争议。但近年来&#xff0c;越来越多的数学领域被严格地分解为各…

如何手动实现multiSetIfAbsent、multiExpire

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”); 📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”); 🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三…

2024年大数据、区块链与物联网国际会议(ICBDBLT 2024)

2024 International Conference on Big Data, Blockchain, and Internet of Things 【1】大会信息 会议简称&#xff1a;ICBDBLT 2024 大会地点&#xff1a;中国青岛 审稿通知&#xff1a;投稿后2-3日内通知 会议官网&#xff1a;www.icbdblt.com 【2】会议简介 即将召开的…

DDoS攻击:企业与个人都应了解的基本知识

DDoS攻击&#xff0c;全称分布式拒绝服务攻击&#xff08;Distributed Denial of Service attack&#xff09;&#xff0c;是一种常见的网络安全攻击方式。以下是对DDoS攻击的详细解释: DDoS攻击是指攻击者利用大量被控制的计算机或设备&#xff08;通常称为“僵尸网络”或“傀…

签到的二维码怎么制作?快速实现制作二维码签到的方法

现在很多活动会采用二维码的方式来做登记、报名、签到等&#xff0c;通过二维码可以快速获取用户信息&#xff0c;并且对于用户填写内容也提升了便利性&#xff0c;而且还能够节约成本&#xff0c;通过后台就可以查看用户登记的数据&#xff0c;方便后期的分析和信息管理。 想…

考研计组chap3存储系统

目录 一、存储器的基本概念 80 1.按照层次结构 2.按照各种分类 &#xff08;41&#xff09;存储介质 &#xff08;2&#xff09;存取方式 &#xff08;3&#xff09;内存是否可更改 &#xff08;4&#xff09;信息的可保存性 &#xff08;5&#xff09;读出之后data是否…

SwaggerSpy:一款针对SwaggerHub的自动化OSINT安全工具

关于SwaggerSpy SwaggerSpy是一款针对SwaggerHub的自动化公开资源情报&#xff08;OSINT&#xff09;安全工具&#xff0c;该工具专为网络安全研究人员设计&#xff0c;旨在简化广大红队研究人员从SwaggerHub上收集已归档API信息的过程&#xff0c;而这些OSINT信息可以为安全人…

【全网瞩目】最强文生图模型,Stable Diffusion 3技术报告解禁

12号&#xff0c;终于在Hugging Face上出现了 Stable Diffusion 3 Medium。没错&#xff0c;正如他所承诺的&#xff0c;最强文生图模型真的开源了。而且此次开源不仅是以SD2的比较下性能得到了更好的升级&#xff0c;同时也向我们展示了最前沿的DiT技术——MMDiT。 是什么让 S…

【乐吾乐2D可视化组态编辑器】导出HTML,下载离线部署包

乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 使用步骤 1. 从“文件”菜单导出HTML 导出为 HTML 需要一定的开发能力&#xff0c;后续不再维护&#xff0c;即将下线&#xff0c;推荐使用 下载离线部署包&#xff08;html&#xff09; 2. 解压 3. 下载后端…

阿里云运维第一步(监控):开箱即用的监控

作者&#xff1a;仲阳 这是云的时代&#xff0c;现在云计算已经在各行各业广泛的应用。但是上云对于大多数客户来说&#xff0c;依然有很大的学习成本&#xff0c;如下图仅是阿里云都有几百款产品&#xff0c;怎么选择&#xff1f;怎么用&#xff1f;对于客户来说都是问题。“…

手撕设计模式——计划生育之单例模式

1.业务需求 ​ 大家好&#xff0c;我是菠菜啊。80、90后还记得计划生育这个国策吗&#xff1f;估计同龄的小伙伴们&#xff0c;小时候常常被”只生一个好“”少生、优生“等宣传标语洗脑&#xff0c;如今国家已经放开并鼓励生育了。话说回来&#xff0c;现实生活中有计划生育&…

2024网络安全学习路线 非常详细 推荐学习

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#…

嵌套查询(二)-谓词EXISTS实现嵌套查询

一、EXISTS谓词 1、作用&#xff1a;用于判断一个子查询的结果是否为空 2、使用语法&#xff1a; 【NOT】EXISTS&#xff08;子查询&#xff09; 语义&#xff1a;如果子查询的查询结果不为空&#xff0c;则EXISTS为真&#xff0c;否则为假 二、举例 1、举例1&#xff1a…

【数据结构 |集合框架、泛型】初始集合框架、时间(空间)复杂度、简单认识泛型

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…