c++设计模式之代理模式

作用

代理模式主要用于,通过代理类,来控制实际对象的访问权限

案例

class VideoSite
{
public:virtual void freeVideo()=0;virtual void vipVideo()=0;virtual void trickVideo()=0;
};class FixBugVideoSite:public VideoSite
{
public:void freeVideo(){cout<<"免费观看电影"<<endl;}void vipVideo(){cout<<"vip客户观看电影"<<endl;}void trickVideo(){cout<<"购买电影票观看电影"<<endl;}
};
void test()
{unique_ptr<VideoSite> p1(new FixBugVideoSite());//没有代理类的情况下,所有客户都可以观看所有电影p1->freeVideo();p1->vipVideo();p1->trickVideo();
}

我们在这段代码里定义了三个功能,来模拟不同的客户观看电影的权限

  • 普通用户:只能免费观看电影
  • vip用户:可以观看vip电影和免费电影
  • 购票用户:可以观看免费电影、vip电影和购票电影

显然对于不同种类的电影,有不同的观看权限。因此,我们要想办法给不同种类的电影赋予不同的权限,这就是代理模式的作用

我们直接看代码

//免费用户代理类
class FreeVideoProxy:public VideoSite
{
public:FreeVideoProxy():_videoPtr(new FixBugVideoSite()){}void freeVideo(){_videoPtr->freeVideo();}void vipVideo(){cout<<"您不是vip用户!"<<endl;}void trickVideo(){cout<<"请购买电影票观看!"<<endl;}
private:VideoSite* _videoPtr;
};void watchVideo(unique_ptr<VideoSite>& videoPtr)
{videoPtr->freeVideo();videoPtr->vipVideo();videoPtr->trickVideo();
}
void test()
{unique_ptr<VideoSite>p1(new FreeVideoProxy());watchVideo(p1);
}

上述代理类的设计控制了非vip用户和非购票用户观看电影的权限,在测试代码里,我们只需使用代理类即可完成对该用户观看电影的权限问题,而不必在原业务的代码上进行修改,大大降低了代码出错的风险。

同理,我们也可以给另外两种用户添加代理类以控制其观看电影的权限,如下:

vip用户代理类

class VipVideoProxy:public VideoSite
{
public:VipVideoProxy():_videoPtr(new FixBugVideoSite()){}void freeVideo(){_videoPtr->freeVideo();}void vipVideo(){   _videoPtr->vipVideo();}void trickVideo(){cout<<"请购买电影票观看!"<<endl;}
private:VideoSite* _videoPtr;
};

购票用户代理类

class TrickVideoProxy:public VideoSite
{
public:TrickVideoProxy():_videoPtr(new FixBugVideoSite()){}void freeVideo(){_videoPtr->freeVideo();}void vipVideo(){   _videoPtr->vipVideo();}void trickVideo(){_videoPtr->trickVideo();}
private:VideoSite* _videoPtr;
};

测试代码

void test()
{unique_ptr<VideoSite>p1(new FreeVideoProxy());unique_ptr<VideoSite>p2(new VipVideoProxy());unique_ptr<VideoSite>p3(new TrickVideoProxy());cout<<"普通用户:"<<endl;watchVideo(p1);cout<<"----------------------"<<endl;cout<<"vip用户:"<<endl;watchVideo(p2);cout<<"----------------------"<<endl;cout<<"购票用户:"<<endl;watchVideo(p3);cout<<"----------------------"<<endl;
}

在测试代码里可以看到,基于这种设计下,FixBugVideoSite类可不必关心业务权限的问题,只需开发不同种类的电影观看业务即可,而电影的观看权限则控制则由代理类完成,使用不同的代理类即可控制不同用户不同电影的观看权限

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

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

相关文章

LCP 30. 魔塔游戏 - 力扣(LeetCode)

题目描述 小扣当前位于魔塔游戏第一层&#xff0c;共有 N 个房间&#xff0c;编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums&#xff0c;其中正数表示道具补血数值&#xff0c;即血量增加对应数值&#xff1b;负数表示怪物造成伤害值&#xff0c;即血量减…

【RT-DETR有效改进】计算训练好权重文件对应的FPS、推理每张图片的平均时间(科研必备)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用我们训练好的权重文件计算FPS,同时打印每张图片所利用的平均时间,模型大小(以MB为单位),同时支持batch_size功能的选择,对于轻量化模型的读者来说,本文的内容对你一定有…

【MySQL】-11 MySQL索引与索引类型

MySQL索引与索引类型 MySQL索引MySQL索引类型包括&#xff1a;&#xff08;1&#xff09;普通索引创建方式&#xff1a;创建索引修改表结构创建表的时候直接指定 (2&#xff09;唯一索引创建方式&#xff1a;创建索引修改表结构创建表的时候直接指定 &#xff08;4&#xff09;…

Docker安装及介绍

一、Docker的介绍 1.1、什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实…

Unity引擎学习笔记之【动画层操作】

动画层Animation Layer 一、动画器的三个基本状态 1. Any State&#xff08;任意状态&#xff09; “Any State”&#xff08;任意状态&#xff09;&#xff1a;这个状态可以用来连接多个状态机的任意状态转换。在动画控制器中&#xff0c;你可以使用“Any State”作为过渡条…

Python基础语法(内置Python, pycharm配置方式)

一.工具安装与配置 1.Python解释器的安装 官网网址:https://www.python.org/ 选择downloads即可(Windows用户点击Windows, 苹果用户点击macOS) 找到最新版本, 并选择 Download Windows installer (64-bit) 下载完成后可在得到一个安装包进行安装(安装时间较长) 安装完成后…

NLP_“预训练+微调大模型”模式和Prompt/Instruct模式的异同

文章目录 “预训练微调大模型”的模式以提示/指令模式直接使用大模型“预训练微调大模型”模式和Prompt/Instruct模式的异同小结 “预训练微调大模型”的模式 经过预训练的大模型所习得的语义信息和所蕴含的语言知识&#xff0c;很容易向下游任务迁移。NLP应用人员可以根据自己…

Java中处理I/O操作的不同方式:BIO,NIO,AIO

Java中处理I/O操作的不同方式&#xff1a;BIO&#xff0c;NIO&#xff0c;AIO 亲爱的朋友&#xff0c; 在这美好的时刻&#xff0c;愿你感受到生活的温暖和欢乐。愿你的每一天都充满着笑容和满足&#xff0c;无论面对什么挑战都能勇往直前&#xff0c;化解困境。 希望你的心中充…

初识C语言·预处理详解

目录 1 预定义符号 2 define定义常量 3 #define定义宏 4 带有副作用的宏 5 宏替换的规则 6 宏和函数的对比 7 # 和 ## i) #运算符 ii) ##运算符 8 命名约定 9 命令行定义 10 条件编译 条件编译1&#xff1a; 条件编译2&#xff1a; 条件编译3&#xff1a; 条件…

昆仑万维发布天工 2.0 大语言模型及AI助手App;AI成功破解2000年前碳化古卷轴

&#x1f989; AI新闻 &#x1f680; 昆仑万维发布天工 2.0 大语言模型及AI助手App 摘要&#xff1a;昆仑万维近日推出了新版MoE大语言模型“天工 2.0”和相应的“天工 AI 智能助手”App&#xff0c;宣称为国内首个面向C端用户免费的基于MoE架构的千亿级参数大模型应用。天工…

每天一个数据分析题(一百五十六)

在数据建模过程中&#xff0c;对于变量的筛选与维度归约&#xff0c;以下哪项描述是正确的&#xff1f; A. 主成分分析适用于可解释性较强的预测模型&#xff0c;因为它减少了变量间的相关性。 B. 变量聚类旨在通过保留所有变量来减少信息损失&#xff0c;适合于所有类型的数…

【力扣 - 时间复杂度和空间复杂度】

力扣刷题时&#xff0c;题目要求里经常有时间复杂度和空间复杂度的要求。那么&#xff0c;什么是时间复杂度和空间复杂度呢&#xff1f; 定义 时间复杂度和空间复杂度都是用于衡量算法性能的指标&#xff0c;但它们分别从不同的角度来评估算法的效率。 时间复杂度&#xff1a…

UE4 C++创建摄像机摇臂和相机并且设置Transform

新建MyPawn C类 .h #include "GameFramework/SpringArmComponent.h" //SpringArm组件 #include "Camera/CameraComponent.h" //Camera组件class 工程名称_API AMyPawn : public APawn { //定义组件变量 public:UPROPERTY(VisibleAnywhere, BlueprintRead…

Android:IntentActivity,Service,BroadcastReceiver

3.14 Android三大组件 1、Intent页面跳转 Intent(意图):将要做某一件事。Android的3大组件:Activity、Service、BroadcastReceiver,通过Intent启动,并且Intent可以携带数据。 Intent类方法setComponent()设置组件; setClass(packageContext,cls)设置类、 setActi…

CGAL::2D Arrangements-8

8.拓扑Traits 拓扑特征类封装了Arrangement_on_surface_2<GeometryTraits_2&#xff0c;TopologyTraits>类模板和外围模块使用的拓扑实体的定义和处理这些拓扑实体的函数的实现。每个拓扑特征类都必须对基本概念ArrangementBasicTopologyTraits进行建模。这一基本概念的…

C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码

一、莱文斯坦&#xff08;Levenshtein&#xff09; Vladimir I. Levenshtein 弗拉基米尔I列文施坦博士是纠错码理论的先驱&#xff0c;被称为俄罗斯编码理论之父。Levenshtein是莫斯科俄罗斯科学院Keldysh应用数学研究所的研究教授&#xff0c;他的贡献体现在消费者的日常生活中…

PyTorch中torchvision库的详细介绍

torchvision 是 PyTorch 生态系统中的一个关键库&#xff0c;专门为计算机视觉任务设计和优化。它提供了以下几个核心功能&#xff1a; 数据集&#xff1a;内置了多种广泛使用的图像和视频数据集&#xff0c;如 MNIST、CIFAR10/100、Fashion-MNIST、ImageNet、COCO 等&#xff…

Linux中的numactl命令指南

假设我们想控制线程如何被分配到处理器核心&#xff0c;或者选择我们想分配数据的位置&#xff0c;那么numactl命令就适合此类任务。在这篇文章中&#xff0c;我们讨论了如何使用numactl命令执行此类操作。 目录&#xff1a; 介绍语法命令总结参考文献 简介 现代处理器采用…

QGIS编译(跨平台编译)之五十一:Shapelib编译(Windows、Linux、MacOS环境下编译)

文章目录 一、Shapelib介绍二、Shapelib下载三、Windows下编译四、Linux下编译五、MacOS下编译一、Shapelib介绍 Shapelib是一个开源的C/C++库,用于读取、写入和处理ESRI Shapefile格式的空间数据。Shapefile是一种常用的GIS数据格式,包含矢量数据,如点、线、面等。Shapeli…

rkmedia使用记录

1.函数 1&#xff09; RK_MPI_VI_SetChnAttr _CAPI RK_S32 RK_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn,const VI_CHN_ATTR_S *pstChnAttr); /*VI通道属性结构体指针1&#xff09;pcVideoNode&#xff1a;video节点路径2&#xff09;u32BufCnt&#xff1a;VI捕获视频…