C++之代理模式

news2024/11/15 23:40:22

目录

模式思想

简介

组成

优点

代码实现

情景

如果不使用代理的话:

加代理的话:

结果


模式思想

简介

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

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

代理模式 属于 结构型模式

组成

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

优点

  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://www.coloradmin.cn/o/730991.html

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

相关文章

深入理解java虚拟机精华总结:硬件的效率与一致性、Java内存模型、Java与线程、Java与协程

深入理解java虚拟机精华总结&#xff1a;硬件的效率与一致性、Java内存模型、Java与线程、Java与协程 硬件的效率与一致性Java内存模型主内存与工作内存内存间交互操作对于volatile型变量的特殊规则针对long和double型变量的特殊规则原子性、可见性与有序性原子性可见性有序性 …

数学建模之灰色预测方法

数学建模之灰色预测方法 目录灰色关联度矩阵关联系数关联矩阵 GM(1,1)模型相关原理matlab程序 目录 灰色关联度矩阵 关联系数 计算关联系数公式 步骤 第一步 第二步 求参考数列和待比较数列矩阵数值做差之后的最小值和最大值 第三步利用公式计算关联度系数&#xff0c;其中将…

【C++修炼之路】32.智能指针

每一个不曾起舞的日子都是对生命的辜负 智能指针 一.为什么需要智能指针&#xff1f;二.智能指针解决new抛异常的示例三.智能指针的使用及其原理3.1 RAII3.2 SmartPtr存在的问题3.3 std::auto_ptr3.4 std::unique_ptr3.5 std::shared_ptrstd::shared_ptr的基本设计std::shared_…

海明码(汉明码)原理及其计算方法

海明码&#xff08;汉明码&#xff09;是一种利用奇偶性检测和纠正错误的编码方法。在传输和储存数据时&#xff0c;可能会发生传输错误或数据损坏。海明码通过在数据中添加冗余位来检测错误并进行纠正&#xff0c;提高了传输和存储数据的可靠性。 基本原理&#xff1a;将原始…

【数据结构复习】汉诺塔:快速回忆汉诺塔问题

题目 题解 众所周知这是一个递归问题&#xff08; 我们只需要注意两点&#xff1a;①什么时候退出递归 ②怎么从n-1推出n ①什么时候退出递归&#xff1a;很明显啦&#xff0c;n1的时候&#xff0c;我们直接把A位置的唯一盘子移到C上&#xff0c;大功告成。 ②怎么从n-1推出n…

Vision Pro销售策略曝光,面罩/头带/屈光镜片加大零售难度

彭博社Mark Gurman再次发布了关于苹果Vision Pro的销售策略&#xff0c;以及零售方面的难题。 一、销售计划和策略 1&#xff0c;2024年初先在美国部分门店销售&#xff0c;仅线下购买&#xff0c;线上暂不开放。购买方式是先线上预约&#xff08;可能要提供面部扫描图、眼镜…

Python 利用opencv识别某象旋转验证码,识别率达95%以上

本期介绍某象旋转验证码识别,识别的思想其实与上篇文章识别滑动还原验证码相似,也是借鉴过来的,但是旋转验证码更加复杂,实现起来稍加困难,下面来看一下,原始数据集和识别之后数据集。 原始数据集: 将圆图旋转成功之后的数据集: 注意:我这里仅仅抓取了几十张作为数据…

c++使用回调函数

前言 回调函数的使用场景&#xff0c;当内部逻辑不知道用户的类型时&#xff0c;让用户自己提供对应数据类型的函数。 代码 #include<iostream> using namespace std;/// <summary> /// 万能打印函数。用户调用 /// </summary> /// <param name"d…

操作系统第六章之进程同步

操作系统第六章之进程同步 参考资料来源竞争同步临界区问题标准解决方案Peterson solution 硬件同步TestAndSet指令Swap介绍 信号量SemaphoresCritical Section of n n n Processes 信号量的实现Semaphore Implementation死锁和饥饿 经典同步问题有限缓冲问题生产者进程的结构…

笔记2(DCL指令)

用处&#xff1a;用来管理数据库 用户&#xff0c;控制数据库的访问 权限 DCL – 用户管理 1.查询用户 use mysql; select * from user; 2.创建用户 create user 用户名主机名 identified by 密码; 例如&#xff1a; create user xiaojielocalhost identified by 4620; 创建…

可重入函数、volatile关键字、SIGCHLD信号

目录 一、可重入函数 二、volatile关键字 三、SIGCHLD信号 一、可重入函数 以一个链表头插为例子 main函数调用insert函数像一个链表head中插入节点node1&#xff0c;插入操作分为两步&#xff0c;刚做完第一步的时候因为硬件中断使进程切换到内核&#xff0c;再次回到用户…

Visual studio 2015下载安装以及缺包提示的处理方法

最近要加入的比赛团队需要用到Visual studio 2015&#xff0c;百度后找到很多资源&#xff0c;自己也转到了百度网盘。中英文都有&#xff0c;需要的可以下载。 链接&#xff1a;https://pan.baidu.com/s/12gpVwXfQxfdkXub-IwhWFw?pwds325 提取码&#xff1a;s325 --来自百…

linux安装交叉编译环境

1、安装系统自带的交叉编译环境 sudo apt install gcc-arm-linux-gnueabihf sudo apt install g-arm-linux-gnueabihf 2、选择特定交叉编译器版本 版本路径&#xff1a;Linaro Releases 当前选择版本&#xff1a;4.9 、64位的版本

ArcGIS栅格影像数据处理

ArcGIS栅格影像数据处理 文章目录 ArcGIS栅格影像数据处理1. 栅格影像数据坐标系转换2. 栅格数据16bit转8bit3. 栅格数据波段变换参考链接 1. 栅格影像数据坐标系转换 点击【ArcToolbox】>【数据管理工具】>【投影和变换】>【栅格】>【投影栅格】。 2. 栅格数据16…

Jetpack compose——深入了解recomposition的工作原理

一、compose怎么 实现响应式编程的 Jetpack Compose 是 Android 的现代 UI 工具包&#xff0c;它使用 Kotlin 语言的声明式 UI 模式来简化 UI 开发。在这种模式中&#xff0c;你只需描述 UI 应该如何根据应用的状态进行显示&#xff0c;而 Compose 会在状态发生变化时自动更新…

【Linux】oh-my-zsh终端配置

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍oh-my-zsh终端配置。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

Spring Boot发送QQ邮件

Spring Boot发送QQ邮件 1. 创建Spring Boot项目2. 引入发邮件的starter3. 必要配置4. 编写邮件内容5. 测试其他&#xff1a; Spring Boot简单引入一个包就能轻松发邮件&#xff0c;仅需5分钟就能实现 1. 创建Spring Boot项目 略 2. 引入发邮件的starter <dependency>&l…

学习在外部Python脚本中运行Houdini的Python接口(hou模块)

0. 目标 学习在外部Python脚本&#xff08;而非Houdini编辑器内部&#xff09;使用 hou 。 主要参考Houdini官方文档 Command-Line Scripting 中的【Accessing hou from a Regular Python Shell】部分。我将要点记录在下&#xff1a; 1. 将Houdini的dll加入搜索路径 为了能…

FPGA实验五:信号发生器设计

目录 一、实验目的 二、设计要求 三、实验代码 1.代码原理分析 2.代码设计思路 3.IP核的设计与配置 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 &#xff08;1&#xff09;关于波形一些指标的介绍 &#xff08;2&#xff09;对波形转换功能的验证 &#xf…

【LeetCode】225. 用队列实现栈

225. 用队列实现栈&#xff08;简单&#xff09; 思路 要使用一个队列来实现栈的功能。 具体来说&#xff0c;实现了以下几个方法&#xff1a; push(int x)&#xff1a;将元素 x 入栈&#xff0c;即将元素 x 插入到队列的末尾。pop()&#xff1a;弹出栈顶元素&#xff0c;即将队…