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

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

    • C++ 设计模式——代理模式
      • 1. 主要组成成分
      • 2. 逐步构建代理模式
        • 2.1 抽象主题类定义
        • 2.2 真实主题类实现
        • 2.3 代理类实现
        • 2.4 主函数
      • 3. 代理模式 UML 图
        • 代理模式 UML 图解析
      • 4. 代理模式的优点
      • 5. 代理模式的缺点
      • 6. 代理模式的分类
      • 7. 代理模式和装饰者模式比较
        • 7.1 代理模式 (Proxy Pattern)
        • 7.2 装饰者模式 (Decorator Pattern)
        • 7.3 主要区别
      • 总结
      • 完整代码

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

代理模式(Proxy Pattern)是一种结构型设计模式,通过代理对象控制对其他对象的访问。代理模式通常用于控制对某个对象的访问,提供额外的功能,如延迟加载、访问控制、日志记录等。

其主要实现思想是在客户端和真正要访问的对象之间引入一个代理对象(间接层),于是,以往客户端对真正对象的访问现在变成了通过代理对象进行访问,代理对象在这里起到了一个中介或者桥梁作用。引人代理对象的主要目的是可以为客户端增加额外的功能、约束或针对客户端的调用屏蔽一些复杂的细节问题。

1. 主要组成成分

  • 抽象主题(Subject):定义了真实对象和代理对象的共同接口。
  • 真实主题(Real Subject):实现了抽象主题接口,代表实际的业务逻辑。
  • 代理(Proxy):持有对真实主题的引用,并实现了抽象主题接口。代理可以在访问真实主题之前或之后添加额外的功能。

2. 逐步构建代理模式

以下是一个简单的代理模式示例,通过浏览器访问某个网站,最简单的方式就是在浏览器中输入网站的地址来直接访问。

2.1 抽象主题类定义

首先创建一个基类 WebAddr,代表要访问的网站。

class WebAddr
{
public:virtual void visit() = 0; //执行访问网站的动作,子类中重新实现virtual ~WebAddr() {} //做父类时析构函数应该为虚函数
};
2.2 真实主题类实现

创建两个网站类 WebAddr_ShoppingWebAddr_Video 继承自 WebAddr

//某购物网站
class WebAddr_Shopping :public WebAddr
{
public:virtual void visit(){//......访问该购物网站,可能涉及到复杂的网络通信cout << "访问WebAddr_Shopping购物网站!" << endl;}
};//某视频网站
class WebAddr_Video :public WebAddr
{
public:virtual void visit(){//......访问该视频网站,可能涉及到复杂的网络通信cout << "访问WebAddr_Video视频网站!" << endl;}
};
2.3 代理类实现

引入代理类 WebAddrProxyWebAddr_Shopping_Proxy

//网站代理类
class WebAddrProxy :public WebAddr
{
public://构造函数,引入的目的是传递进来要访问的具体网站WebAddrProxy(WebAddr* pwebaddr) :mp_webaddr(pwebaddr) {}
public:virtual void visit(){//在这里进行访问的合法性检查、日志记录或者流量限制......mp_webaddr->visit();//在这里可以进行针对返回数据的过滤......}
private:WebAddr* mp_webaddr; //代表要访问的具体网站
};//专门针对某购物网站WebAddr_Shopping的代理
class WebAddr_Shopping_Proxy :public WebAddr
{
public:virtual void visit(){//在这里进行访问的合法性检查、日志记录或者流量限制......WebAddr_Shopping* p_webaddr = new WebAddr_Shopping();p_webaddr->visit();//在这里可以进行针对返回数据的过滤......//释放资源delete p_webaddr;}
};
2.4 主函数
int main()
{WebAddr* wba1 = new WebAddr_Shopping();WebAddr* wba2 = new WebAddr_Video();WebAddrProxy* wbaproxy1 = new WebAddrProxy(wba1);wbaproxy1->visit(); //通过代理去访问WebAddr_Shopping购物网站WebAddrProxy* wbaproxy2 = new WebAddrProxy(wba2);wbaproxy2->visit(); //通过代理去访问WebAddr_Video视频网站WebAddr_Shopping_Proxy* wbasproxy = new WebAddr_Shopping_Proxy();wbasproxy->visit(); //访问的实际是某购物网站//资源释放delete wba1;delete wba2;delete wbaproxy1;delete wbaproxy2;//资源释放delete wbasproxy;return 0;
}

3. 代理模式 UML 图

代理模式 UML 图

代理模式 UML 图解析
  • Subject(抽象主题):该类定义了真实主题与代理主题的共同接口,使得在使用真实主题的地方都可以使用代理主题。这里指的是 WebAddr 类。
  • Proxy(代理主题):该类内部包含对真实主题的引用,可以对真实主题进行访问。代理主题中提供与真实主题相同的接口(如 visit),以达到可以取代真实主题的目的。这里指的是 WebAddrProxy 类。
  • RealSubject(真实主题):定义代理主题所代表的真实对象,真正的业务逻辑在真实主题中实现。客户端(如 main 函数)通过代理主题间接访问真实主题中的接口。这里指的是 WebAddr_ShoppingWebAddr_Video 类。

4. 代理模式的优点

  • 控制访问:代理可以控制对真实对象的访问,增加安全性。
  • 延迟加载:可以在需要时才创建真实对象,节省资源。
  • 增强功能:可以在访问真实对象前后添加额外的功能,如日志记录、缓存等。

5. 代理模式的缺点

  • 增加复杂性:引入代理可能会增加系统的复杂性,尤其是在管理代理和真实对象时。
  • 性能开销:代理可能会引入额外的性能开销,尤其是在处理大量请求时。

6. 代理模式的分类

  • 远程代理 (Remote Proxy):用于控制对远程对象的访问,通常用于网络编程中,例如通过网络调用远程服务。
  • 虚拟代理 (Virtual Proxy):用于延迟加载资源,避免不必要的开销。只有在真正需要时才创建真实对象,如大文件或复杂对象的加载。
  • 保护代理 (Protection Proxy):用于控制对对象的访问权限,增强安全性。可以根据不同用户的权限来决定是否允许访问某些方法或数据。
  • 缓存/缓冲代理 (Cache Proxy):用于缓存频繁访问的数据,以减少计算或网络请求的开销。例如,缓存数据库查询结果或API响应。
  • 智能引用代理 (Smart Reference Proxy):用于管理对象的生命周期,例如引用计数或智能指针。可以确保对象在不再需要时被正确释放,避免内存泄漏。
  • 写时代理 (Write Proxy):用于延迟写入操作,直到需要时才执行。可以用于优化性能,尤其在处理大量数据时。

7. 代理模式和装饰者模式比较

代理模式和装饰者模式都是结构型设计模式,但它们的目的和使用场景有所不同。以下是两者的比较:

7.1 代理模式 (Proxy Pattern)
  • 目的:通过代理对象控制对真实对象的访问,提供额外的功能(如访问控制、延迟加载、日志记录等)。
  • 主要角色
    • Subject:定义真实对象和代理对象的共同接口。
    • Real Subject:实现了 Subject 接口,代表实际的业务逻辑。
    • Proxy:持有对真实主题的引用,控制对真实主题的访问。
  • 使用场景
    • 远程对象访问。
    • 资源的延迟加载。
    • 访问权限控制。
    • 添加额外功能(如缓存、日志)。
7.2 装饰者模式 (Decorator Pattern)
  • 目的:动态地给对象添加额外的功能,而不改变其结构。装饰者模式允许通过组合的方式来扩展对象的功能。
  • 主要角色
    • Component:定义一个接口,用于实现具体的对象和装饰者。
    • Concrete Component:实现了 Component 接口的具体对象。
    • Decorator:持有一个 Component 对象的引用,并实现了 Component 接口。可以在调用方法时添加额外的功能。
  • 使用场景
    • 动态添加功能或行为。
    • 需要扩展类的功能而不使用子类。
    • 组合多个装饰器以实现复杂的功能。
7.3 主要区别
  • 代理模式 侧重于控制对对象的访问,主要用于安全性、性能优化等场景。
  • 装饰者模式 则侧重于在不修改对象结构的情况下动态地扩展对象的功能,适用于需要灵活组合功能的场景。
特点代理模式 (Proxy)装饰者模式 (Decorator)
目的控制对真实对象的访问动态增加对象的功能
结构包含真实对象的引用包含一个或多个装饰者
功能扩展主要用于访问控制、延迟加载等主要用于功能扩展和组合
使用方式通过代理对象访问真实对象通过装饰者对象增强组件
透明性代理通常对客户端透明装饰器通常对客户端透明

总结

代理模式通过引入代理对象来控制对真实对象的访问,提供了额外的功能,如延迟加载和访问控制。它在许多场景中都非常有用,但也可能增加系统的复杂性。在使用代理模式时,需要根据具体需求权衡其优缺点。

完整代码

#include <iostream>
#include <vector>
#include <string>
#include <fstream>using namespace std;class WebAddr
{
public:virtual void visit() = 0; //执行访问网站的动作,子类中重新实现virtual ~WebAddr() {} //做父类时析构函数应该为虚函数
};//某购物网站
class WebAddr_Shopping :public WebAddr
{
public:virtual void visit(){//......访问该购物网站,可能涉及到复杂的网络通信cout << "访问WebAddr_Shopping购物网站!" << endl;}
};//某视频网站
class WebAddr_Video :public WebAddr
{
public:virtual void visit(){//......访问该视频网站,可能涉及到复杂的网络通信cout << "访问WebAddr_Video视频网站!" << endl;}
};//---------------------------
//网站代理类
class WebAddrProxy :public WebAddr
{
public://构造函数,引入的目的是传递进来要访问的具体网站WebAddrProxy(WebAddr* pwebaddr) :mp_webaddr(pwebaddr) {}
public:virtual void visit(){//在这里进行访问的合法性检查、日志记录或者流量限制......mp_webaddr->visit();//在这里可以进行针对返回数据的过滤......}
private:WebAddr* mp_webaddr; //代表要访问的具体网站
};//专门针对某购物网站WebAddr_Shopping的代理
class WebAddr_Shopping_Proxy :public WebAddr
{
public:virtual void visit(){//在这里进行访问的合法性检查、日志记录或者流量限制......WebAddr_Shopping* p_webaddr = new WebAddr_Shopping();p_webaddr->visit();//在这里可以进行针对返回数据的过滤......//释放资源delete p_webaddr;}
};int main()
{WebAddr* wba1 = new WebAddr_Shopping();WebAddr* wba2 = new WebAddr_Video();WebAddrProxy* wbaproxy1 = new WebAddrProxy(wba1);wbaproxy1->visit(); //通过代理去访问WebAddr_Shopping购物网站WebAddrProxy* wbaproxy2 = new WebAddrProxy(wba2);wbaproxy2->visit(); //通过代理去访问WebAddr_Video视频网站WebAddr_Shopping_Proxy* wbasproxy = new WebAddr_Shopping_Proxy();wbasproxy->visit(); //访问的实际是某购物网站//资源释放delete wba1;delete wba2;delete wbaproxy1;delete wbaproxy2;//资源释放delete wbasproxy;return 0;
}

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

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

相关文章

深度学习——分布式训练

目录 1. 前言2.分布式训练的分类3.不并行&#xff08;单机单卡&#xff09;4. 数据并行 DP和DDP4.1 异同点4.2 原理4.3 DP 实现&#xff08;单机多卡&#xff09;4.4 DDP 实现&#xff08;单机多卡&#xff0c;多机分布式&#xff09;4.4.1DDP 基本概念4.4.2 DDP之单机多卡4.4.…

jmeter中CSV 数据文件设置用例

1、CSV数据文件的基础使用 线程组->添加->配置远近->CSV数据文件设置 2、多条用例运行CSV数据文件 由于我的csv请求的json数据有“&#xff0c;”所以我这边 分隔符选择了*号 写了两行需要测试的用例&#xff0c;需要添加一个“循环控制器” 线程组->添加-&g…

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;测试2、克隆项目&#xff0c;测试 安装完成&#xf…

一文读懂大语言模型:基础概念篇

在当今AI时代&#xff0c;大语言模型正以前所未有的速度重塑我们的世界。作为NLP领域的明星&#xff0c;它们不仅理解语言&#xff0c;更创造语言&#xff0c;开启了智能交互的新纪元。 本文将介绍着重介绍大模型的概念&#xff0c;帮助大家简单了解其技术原理、发展历程&#…

Autosar(Davinci) --- 创建一个Implementation Data Types

前言 这里我们讲一下如何创建一个Implementation Data Types&#xff08;IDT) 一、什么是IDT 二、如何创建一个IDT 鼠标右键【Implementation Data Types】,选择【new Type Reference...】 起一个名字【IdtDoorState】&#xff0c;Data Types选择【boolean】&#xff0c;这里…

海康VisionMaster使用学习笔记18-常见问题排查

常见问题排查思路 常见问题排查方法-安装阶段 常见问题排查方法-启动阶段 常见问题排查方法-使用阶段 常见问题排查方法-相关资料 关于VisionMaster使用的学习笔记到这里告一段落了,继续海康二次开发的学习. 海康二次开发 海康相机二次开发学习笔记1-环境配置

设计模式-结构型模式-适配器模式

1.适配器模式定义 将类的接口转化为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作&#xff1b; 1.1 适配器模式的优缺点 优点 将目标类和适配者类解耦&#xff0c;通过引入一个适配器类来重用现有的适配者类&#xff0c;无需修改原有结构&#x…

linux安装elasticsearch

只考虑单机的情况&#xff0c;因为没有那么大的需求 首先创建个文件夹用于存放elasticsearch cd /opt/mkdir modulecd module根据官网提示下载 官网文档链接 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-x86_64.rpmwget https://artifac…

USB详解,配置及难点

一、USB发展历史 二、USB简介 USB有USB1.0/1.1/2.0/3.0多个版本&#xff0c;标准USB由4根线组成,VCC&#xff0c;GND&#xff0c;D&#xff0c;D-&#xff0c;其中D和D-是数据线&#xff0c;采用差分传输。在USB主机上,D-和D都是接了15K的电阻到地,所以在没有设备接入的时候,D、…

2024年第六届控制与机器人国际会议(ICCR 2024)即将召开!

2024年第六届控制与机器人国际会议&#xff08;ICCR 2024&#xff09;将于2024年12月5日至7日在日本横滨举行。智能机器人结合了多种概念、学科和技术&#xff0c;共同创造出各种有用的设备、操作器和自主实体&#xff0c;为特定人类社区服务&#xff0c;如制造设备、医疗和远程…

极光推送(JPush)赋能登虹科技,打造智慧视觉云平台新体验

近日&#xff0c;中国领先的客户互动和营销科技服务商极光&#xff08;Aurora Mobile&#xff0c;纳斯达克股票代码&#xff1a;JG&#xff09;与杭州登虹科技有限公司&#xff08;以下简称“登虹科技&#xff08;Closeli&#xff09;”&#xff09;达成合作&#xff0c;借助极…

C++学习笔记——打印ASCII码

一、题目描述 二、代码 #include <iostream> using namespace std; int main() {char a_char;int a_int;cin >> a_char;a_int a_char;cout << a_int;return 0; }

企业建站技术路线探索

前言 企业站是指企业或公司创建的官方网站&#xff0c;用于展示企业信息、产品和服务。它通常包括公司简介、产品或服务介绍、联系方式、新闻更新等内容。企业站的目的是提升品牌形象、提供客户服务和促进业务发展。在跨境贸易中&#xff0c;企业建站尤为关键&#xff0c;因为…

python-docx复制的行格式多出一个单元格

目录 一、问题 二、原因 三、解决方法 一、问题 我需要在下述表格中第三行的编号、证件名称、来源、证明对象一列的第三行填入1、1、1、1&#xff0c;之后复制第三行的格式&#xff0c;再填入2、2、2、2&#xff0c;再复制第三行的格式&#xff0c;填入3、3、3、3&#xff…

VBA技术资料MF180:将某个文件夹中的某类图片导入Word

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

工作实战-项目压测记录

1-1-1每分钟的单量 1-1-2第二版测试 2022年5月16日 17:43:11 成功 失败 其它(nginx) 真实入库单量 总单量 52 1 447 500 2022年5月16日 19:42:18 成功 失败 其它(nginx) 真实入库单量 总单量 311 689 306 1000 2-0-1. 20线程-2000单执行结果 2-1-0. 40线…

关键点检测——HRNet源码解析篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

JavaEE 第18节 TCPUDP优缺点(对比)

目录 前言1、UDP(User Datagram Protocol)优点缺点 2、TCP(Transmission Control Protocol)优点缺点 3、总结 前言 基于TCP/IP协议栈&#xff0c;TCP和UDP属于传输层协议。在Java生态中也分别提供了相关套接字&#xff08;Socket&#xff09;1的API&#xff0c;方便网络编程。…

C++资料电子书资源PDF免费分享

C电子书 这里写目录标题 C电子书目录资源获取 目录 《数据结构(C语言版)》(严蔚敏 吴伟明编著).pdf 7.6MB 《C程序设计题解与上机指导》(第二版).谭浩强.pdf 7.0MB 《C程序设计(第四版)学习辅导》.谭浩强.扫描版.pdf 13.1MB 《C程序设计》第一版&#xff08;谭浩强&#xff09…

反汇编快速定位内核OOPS

前言 简单的说&#xff0c;出现内核奔溃&#xff0c;我们可以通过串口日志提供的信息&#xff1b;使用gdb反汇编出问题函数所在的文件&#xff0c;然后使用《disassemble /m 函数名》查看具体函数的源码和汇编码&#xff1b;这样能直观的看到源代码对应的汇编码干了什么&#…