C++之代理模式

article/2025/10/2 7:27:47

目录

模式思想

简介

组成

优点

代码实现

情景

如果不使用代理的话:

加代理的话:

结果


模式思想

简介

代理模式:    通过代理类,来控制实际对象的访问权限。

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式 属于 结构型模式

组成

  • 抽象角色:通过接口或抽象类声明真实角色实现的业务方法;
  • 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用;
  • 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。(访问权限)

优点

  1. 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职的事务,通过后期的代理来完成事务,附带的结果就是编程简洁清晰;
  2. 代理对象可以在客户端和目标对象之间起到中介的作用,保护了目标对象
  3. 高扩展性

代码实现

情景

了解了代理模式的定义和优点以后,我们来模拟这样一个场景:

我们上视频网站上去看电影,电影也分有好几个级别:  免费电影、VIP电影、用券电影,不同的人可以看不同级别的电影

如果不使用代理的话:

 我们可以看到还是纯在有很多的不足的,没用访问权限的控制。

加代理的话:

通过代理类,来控制用户的访问权限。

//抽象类
class VideoSite
{
public:virtual void freeMovie() = 0;  //免费电影virtual void vipMovie() = 0;   //vip电影virtual void ticketMovie() = 0;//用券电影
};//委托类
class FixBugVideoSite : public VideoSite 
{
public:virtual void freeMovie()  //免费电影{cout << "观看免费电影" << endl;}virtual void vipMovie()   //vip电影{cout << "观看vip电影" << endl;}virtual void ticketMovie() //用券电影{cout << "用券观看电影" << endl;}
};//普通用户代理类
class FreeVideSiteProxy : public VideoSite
{
public:FreeVideSiteProxy(){pVideo = new FixBugVideoSite();}~FreeVideSiteProxy(){delete pVideo;}virtual void freeMovie()  //免费电影{pVideo->freeMovie(); //通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法}virtual void vipMovie()   //vip电影{cout << "不好意思,您不是VIP,请先充值。"<<endl;}virtual void ticketMovie()//用券电影{cout << "不好意思,您没有券,请先购买。"<<endl;}
private:FixBugVideoSite* pVideo;
};//VIP用户代理类
class vipVideSiteProxy : public VideoSite
{
public:vipVideSiteProxy(){pVideo = new FixBugVideoSite();}~vipVideSiteProxy(){delete pVideo;}virtual void freeMovie()  //免费电影{pVideo->freeMovie(); //通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法}virtual void vipMovie()   //vip电影{pVideo->vipMovie();}virtual void ticketMovie()//用券电影{cout << "不好意思,您没有券,请先购买。"<<endl;}
private:VideoSite* pVideo;
};

可以看到,我们代码里面的委托类FixBugVideoSite就是上面提到的真实角色。它拥有了该网站所有视频的观看权限。
每一个代理类都有一个委托类的数据成员。代理类通过委托类来访问视频网站。并且,可以根据当前代理的用户的身份(普通游客VIP会员),来限制其访问的内容。

为了模拟在视频网站上浏览视频的全部情景,我们可以设计一个函数,专门用来观看电影(免费电影VIP电影用券观看的电影

void watchMovie(unique_ptr<VideoSite>& ptr)
{ptr->freeMovie();ptr->vipMovie();ptr->ticketMovie();
}

结果

运行下面的代码:

void main()
{unique_ptr<VideoSite> p1 (new FreeVideSiteProxy());unique_ptr<VideoSite> p2(new vipVideSiteProxy());watchMovie(p1);cout << "--------------------------" << endl;watchMovie(p2);
}

 


http://chatgpt.dhexx.cn/article/4LStsWJa.shtml

相关文章

代理模式与动态代理模式

原文地址&#xff1a;点击打开链接 1、代理模式 所谓代理&#xff0c;就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下&#xff0c;一个客户不想或者不能够直接引用一个对象&#xff0c;而代理对象可以在客户端和目标对象之前起到中介的作用。 代理模…

设计模式之代理模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、代理模式是什么&#xff1f; 代理模式是一种结构型的软件设计模式&#xff0c;在不改变原代码前提下&#xff0c;提供一个代理…

动态代理模式详解

目录 &#xff08;一&#xff09;什么是动态代理模式 &#xff08;二&#xff09;动态代理模式入门案例 1.完成一个账户转账的功能 2. v1.0版本为转账添加一个事务 3.v2.0将事务从业务层和从持久层剥离 4.v3.0将事务使用动态代理完成 5.v3.0通过cglib实现代理模式 &…

三种代理模式详解

文章目录 二、代理模式&#xff08;Proxy Pattern&#xff09;1、常见的几种代理模式&#xff1a;2、静态代理3、JDK动态代理4、CGLib代理5、CGLib和JDK动态代理的区别 二、代理模式&#xff08;Proxy Pattern&#xff09; 根据B站狂神视频整理&#xff1a;https://www.bilibil…

Spring的代理模式

1、代理模式 为什么要学习代理模式&#xff1f; 因为这就是springAOP的底层&#xff01;【springAOP和springMVC】 代理模式的分类&#xff1a; 静态代理动态代理 1.1、静态代理 角色分析&#xff1a; 抽象角色&#xff1a;一般会使用接口或者抽象类来解决真实角色&…

代理模式(Proxy模式)详解

在有些情况下&#xff0c;一个客户不能或者不想直接访问另一个对象&#xff0c;这时需要找一个中介帮忙完成某项任务&#xff0c;这个中介就是代理对象。例如&#xff0c;购买火车票不一定要去火车站买&#xff0c;可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保…

代理模式的详细介绍

国庆期间闲来无事&#xff0c;写了一个简单的小程序&#xff0c;小程序名称叫做 IT藏经楼。目的是分享这些年自己积累的一些学习材料&#xff0c;方面大家查找使用&#xff0c;包括电子书、案例项目、学习视频、面试题和一些PPT模板。里面所有材料都免费分享。目前小程序中只发…

代理模式

代理模式 代理模式应用场景模式结构实现方式 代理模式 控制着对于原对象的访问&#xff0c; 并允许在将请求提交给对象前后进行一些处理。 优点&#xff1a; 在客户端与目标对象之间起到一个中介作用和保护目标对象的作用&#xff1b;代理对象可以扩展目标对象的功能&#x…

代理模式详解

1. 代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。 代理模式一半包含三种角色&#x…

代理模式详细讲解

文章目录 一、什么是代理模式&#xff1f;二、 为什么使用代理模式&#xff1f;三、 代理模式的实现1、静态代理1.1、 创建公共的接口1.2、 创建被代理角色1.3、 创建代理角色1.4、 创建测试类 2、动态代理的实现2.1、 使用 JDK 的 Proxy 类实现动态代理1、 创建业务接口2、 创…

一文搞懂代理模式

代理模式 前言一、代理模式是什么&#xff1f;二、静态代理三、动态代理1.jdk动态代理&#xff08;接口代理&#xff09;2.cglib动态代理 前言 一、代理模式是什么&#xff1f; 代理模式是常见的设计模式之一&#xff0c;顾名思义&#xff0c;代理模式就是代理对象具备真实对象…

手机测试耳机音质的软件,耳机音质测试软件有哪些

耳机音质测试软件并不存在&#xff0c;因为耳机的音质对于人来说是主观的&#xff0c;你认为音质好的耳机&#xff0c;有的人却并不认为也很正常&#xff0c;国内外都没有恒定的耳机音质评判标准&#xff0c;大多数人认为音质好的耳机&#xff0c;那么它十有八九实际就是好的。…

软件测试的基本理论与方法

文章目录 前言软件测试基础1. 软件测试的概念2. 软件测试的目的 测试用例1. 测试用例的概念2. 测试用例的分类3. 测试用例的治理4. 测试用例的编制及使用5. 测试需求 软件生命周期1. 问题的定义及规划2. 需求分析3. 软件设计4. 程序编码5. 软件测试6. 运行维护7. 生命周期模型 …

固态硬盘测试软件有哪些,SSD测试软件有哪些?SSD测试软件盘点

在购买了固态硬盘(SSD)后&#xff0c;如果对商家或官方给出的诸如读写速度等关键性数据存在质疑的话&#xff0c;最好的解决方法莫过于通过SSD测试软件来找寻答案。那么&#xff0c;SSD测试软件有哪些&#xff1f;SSD测试软件哪个比较好用呢&#xff1f;针对上述问题&#xff0…

软件工程-软件测试-测试方法

软件工程-测试方法-白盒和黑盒测试 软件工程-软件测试 软件测试方法可以分为静态测试和动态测试。 静态测试 静态测试是指被测试程序不在程序上运行&#xff0c;而是采用人工检测和计算机辅助金泰分析的手段对程序进行检测。 静态测试方法 &#xff08;1&#xff09;人工检…

软件测试方法和技术有哪些?

软件测试方法和技术有哪些&#xff1f;包括软件测试基础、软件测试方法、软件测试流程和规范、单元测试与集成测试、系统测试、验收测试、软件本地化测试、测试自动化及其框架、白盒测试和黑盒测试等。 软件测试方法技术   软件测试方法&#xff1a; 一、等价类测试方法的…

软件测试方法汇总 - 从不同角度分析软件测试方法有哪些

1、从是否关心内部结构来看 &#xff08;1&#xff09;白盒测试&#xff1a;又称为结构测试或逻辑驱动测试&#xff0c;是一种按照程序内部逻辑结构和编码结构&#xff0c;设计测试数据并完成测试的一种测试方法。 &#xff08;2&#xff09;黑盒测试&#xff1a;又称为数据驱…

常见的软件测试方法有,常见的几种软件测试方法都有哪些

随着互联网的不断发展&#xff0c;越来越多的人也都开始学习软件测试的相关技术&#xff0c;而今天我们就一起来了解一下&#xff0c;常见的几种软件测试方法都有哪些。 1、单元测试 单元测试测试的是代码库的单元。 它们直接调用函数或单元&#xff0c;并确保返回正确的结果。…

Dynatrace系列之- 标记常见问题

Dynatrace系列之- 标记常见问题 在大型环境中&#xff0c;系统的某些方面可能会持续触发不必要的警报。这些告警可能来自非关键组件或者是非关键情况下的资源不足的问题。通常这些问题不需要人员响应。 为了减少此类警报并避免发出垃圾告警邮件&#xff0c;Dynatrace AI根因分…

什么是 Dynatrace 里的 Visually Complete 度量标准

Dynatrace 中的 Visually Complete 是一个度量标准&#xff0c;用于测量在加载过程中用户在页面上看到的内容。Visually Complete 指标是当一个用户看到页面上的所有重要元素并且它们正确地渲染时所测量的时间点。这意味着所有可见的文本、图像和视频都已加载并正确显示。该指标…