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

文章目录
- 引言
- 代理模式的定义
- 代理模式的具体实现
引言
我们经常听到代理服务器「代理服务器是一个中间服务器,能够接收客户端的请求,并代表客户端向服务器发起请求,然后将服务器返回的数据转发给客户端」。其实在C++设计模式中,也有一种模式叫做——代理模式。
代理模式的定义
代理模式(Proxy Pattern)是一种结构型设计模式,在软件设计中,它为其他对象提供了一种代理或占位符,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,可以隐藏目标对象的实现细节,增加额外的功能(如访问控制、日志记录、性能监控等),或者对目标对象的访问进行优化。
代理模式的具体实现
具体要求有:
-
创建一个接口「抽象类」。
-
将抽象类的接口在真实类和代理类中具体实现。在代理类中,定义一个真实类的指针对象,实现多态。
-
在代理类中,对用户的访问请求做权限认证。
以下是一个视频网站的代理模式。
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
//创建一个抽象类
class VideoSite
{
public:virtual void freeMovie() = 0;virtual void vipMovie() = 0;virtual void ticketMovie() = 0;virtual ~VideoSite() = 0;};
//这是一个真实类 在类中对抽象类的接口做具体的实现。
class FixBugVideoSite:public VideoSite
{
public:void freeMovie(){cout << "观看免费电影" << endl;}void vipMovie(){cout << "观看VIP电影" << endl;}void ticketMovie(){cout << "观看券电影" << endl;}~FixBugVideoSite(){}
};
//这是一个代理类 对免费观看的业务进行代理
class freeMovieAgent :public VideoSite
{
public:~freeMovieAgent(){delete _pVideo;}void freeMovie(){_pVideo->freeMovie();}void vipMovie(){cout << "您当前是普通用户,需要升级VIP,才能观看本部分内容" << endl;}void ticketMovie(){cout << "您需要用券,才能观看本部分内容" << endl;}
private://定义一个指向真实类的指针「实现多态」VideoSite* _pVideo = new FixBugVideoSite();
};
//这是一个代理类 对vip观看的业务进行代理
class vipMovieAgent :public VideoSite
{
public:~vipMovieAgent(){delete _pVideo;}void freeMovie(){_pVideo->freeMovie();}void vipMovie(){_pVideo->ticketMovie();}void ticketMovie(){cout << "您需要用券,才能观看本部分内容" << endl;}
private://定义一个指向真实类的指针「实现多态」VideoSite* _pVideo = new FixBugVideoSite();
};
//这是一个代理类 对券观看的业务进行代理
class ticketMovieAgent :public VideoSite
{
public:~ticketMovieAgent(){delete _pVideo;}void freeMovie(){_pVideo->freeMovie();}void vipMovie(){_pVideo->vipMovie();}void ticketMovie(){_pVideo->ticketMovie();}private://定义一个指向真实类的指针「实现多态」VideoSite* _pVideo = new FixBugVideoSite();
};
int main()
{//客户直接访问代理对象unique_ptr< VideoSite> V1(new freeMovieAgent());V1->freeMovie();V1->vipMovie();
}
相关文章:
C++设计模式——代理模式
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言代理模式的定义代理模式的具体实现 引言 我们经常听到代理服务器「代理服务器是一个中间服务器,能够接收客户端的请求,并代表客户端向服务器发起请求,然后将服…...
docker 复制文件,清除不再使用数据导出以及导出文件系统
docker cp -a centos :/etc/centos-release #将容器内文件复制到宿主机 docker cp /etc/issue centos:/root #将宿主机文件复制到容器内 docker export: 将一个运行的或者挺值得容器的文件系统导出为一个tar归档文件。需要注意,docker export 不会包含该…...
【Vue】Vue3.0(十一)Vue 3.0 中 computed 计算属性概念、使用及示例
上篇文章:【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月15日10点23分 文章目录 Vue 3.0中…...
【第三版 系统集成项目管理工程师】第17章 法律法规和标准规范
持续更新。。。。。。。。。。。。。。。 【第三版】第17章 法律法规和标准规范 17.1法律法规17.1.1 法与法律 P5801.基本概念-P5802.本质与特征-P580 17.1.2 法律体系1.世界法律体系(非重点)-P5802.中国特色社会主义法律体系-P581 17.1.3 法的效力1.对象效力-P5822.空间效力-…...
安装 LLM 编程工具 cursor
1,网址 cursor.com 点击 Download for Free 下载安装包 下载到一个300KB的安装压缩包,解压后双击后,点 open 安装过成会下载真正的应用程序 点击 continue 登陆 比如选择使用 github账号登陆 则会弹出如下网页: 先登陆 github&a…...
Java链式编程的定义、例子、使用方法、实际应用场景、自动装配构造
链式编程(Fluent Interface)是一种编程风格,允许通过方法调用连接在一起进行操作,通常用于提高代码的可读性和简洁性。在 Java 中,链式编程常通过返回 this(当前对象)来实现。这种做法在构建器模…...
用 Git Stash 临时保存修改,轻松切换任务!
在开发过程中,我们经常会遇到这样的情况:正在写代码,突然领导或同事让你赶紧处理一个紧急 bug,但你当前的代码还没写完,不能提交,这时候该怎么办呢?别慌,Git 的 stash 命令正好能帮上…...
Android 下通过触发 SIGTRAP 信号实现反调试
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 详细的 Linux 信号列表 Linux 信号是一种用于进程间通信(IPC)和异常处理的机制。以下是详细的 Linux 信号列表,包含信号名…...
【MySQL】 表的增删操作
目录 1.Create(增) 1.1.单行数据 全列插入 1.2.多行数据 指定列插入 1.3.插入否则更新 1.4.替换数据(REPLACE) 2.Delete(删) 2.1.删除表中的某个条目 2.2.删除整张表数据 2.3.截断表 1.Create…...
新生入门季 | 学习生物信息分析,如何解决个人电脑算力不足的问题?
随着生物信息学在科研和教育中的快速普及,越来越多的新生开始接触基因组测序、RNA分析等复杂计算任务。然而,在面对这些大规模数据时,个人电脑的算力往往显得捉襟见肘。你是否也在为自己的笔记本性能不足而苦恼? 这篇文章将为你提…...
20255 - 中医方剂学 - 考研 - 执业
第1章 总论 1.我国现存最早的记载方剂的医书是()( ) [单选] A.《太平圣惠方》 B.《黄帝内经》 C.《五十二病方》 D.《千金要方》 E.《外台秘要》 正确答案: C 2.我国最早的中医经典理论著作是()( ) [单选] A.《伤寒杂病论…...
【Vue.js设计与实现】第三篇第9章:渲染器-简单Diff算法-阅读笔记
文章目录 9.1 减少 DOM 操作的性能开销9.2 DOM 复用与 key 的作用9.3 找到需要移动的元素9.4 如何移动元素9.5 添加新元素9.6 移除不存在的元素 系列目录:【Vue.js设计与实现】阅读笔记目录 当新旧vnode 的子节点都是一组节点时,为了以最小的性能…...
服务器软件之Tomcat
服务器软件之Tomcat 服务器软件之Tomcat 服务器软件之Tomcat一、什么是Tomcat二、安装Tomcat1、前提:2、下载3、解压下载的tomcat4、tomcat启动常见错误4.1、tomcat8.0 startup报错java.util.logging.ErrorManager: 44.2、java.lang.UnsatisfiedLinkError 三、Tomca…...
Flutter包管理(三)
1、作用 在APP的实际开发过程中往往会依赖很多包,而这些包之间存在着交叉依赖、版本依赖,由开发者自己管理手动管理会非常麻烦,每种开发生态或编程官方会提供一些包的管理工具,在Flutter中我们在pubspec.yaml文件中来管理第三方依…...
CGNS资料
CGNS数据文件 资料 CFD General Notation System CGNS Converters vtkCGNSReader cgnsToFromFoam Example Computer Codes 8.1.2. CGNS Mesh Format and Multizone Interface Connectivity 8 Multizone Interface Connectivity pyvista.cgnsreader CGNS for MATLAB and Octave…...
论文阅读(十六):Deep Residual Learning for Image Recognition
文章目录 1.介绍2.基本原理3.两种残差块4.网络结构 论文:Deep Residual Learning for Image Recognition 论文链接:Deep Residual Learning for Image Recognition 代码链接:Github 1.介绍 在ResNet网络提出之前,传统的卷…...
Dubbo 序列化方式
Hession 这是dubbo的默认序列化协议,是一种二进制协议,他的特点是序列化的速度比较快,并且序列化的数据体积比较小。Hession适合于大部分场景,因此被选为dubbo的默认序列化协议。 Json Json是一种基于文本的序列化方式…...
如何替换OCP节点(二):使用 antman脚本 | OceanBase应用实践
前言: OceanBase Cloud Platform(简称OCP),是 OceanBase数据库的专属企业级数据库管理平台。 在实际生产环境中,OCP的安装通常是第一步,先搭建OCP平台,进而依赖OCP来创建、管理和监控我们的生…...
15.JVM垃圾收集算法
一、垃圾收集算法 1.分代收集理论 分代收集理论是JAVA虚拟机进行垃圾回收的一种思想,根据对象存活周期的不同将内存分成不同的几个区域;一般将JAVA堆内存分为新生代和老年代;根据每个分代特点选择不同的垃圾收集器; 在新生代中&am…...
软件工程:图书管理系统甘特图
1 实验目的 熟悉GanttProject 软件环境,能够使用GanttProject绘制甘特图,进行项目管理与规划。 2 实验内容 为小型图书管理系统项目的实施计划绘制甘特图。 小型图书管理系统项目包含登录、浏览、管理读者、管理图书资料、管理书目、登记借书、登记还书、预定图书、…...
数字游民工作流:OpenClaw+千问3.5-27B自动处理跨境邮件
数字游民工作流:OpenClaw千问3.5-27B自动处理跨境邮件 1. 为什么需要自动化邮件处理 作为数字游民,我每天需要处理来自不同时区的客户邮件。这些邮件往往混杂着英语、西班牙语和中文,且包含大量模糊的需求描述。最痛苦的是凌晨三点被手机提…...
ANDON系统赋能自行车制造实现异常闭环管理
传统自行车制造业面临着多工位协同效率低、异常响应滞后等痛点。以某自行车制造工厂为例,其生产线涵盖车架组装、轮组调试、整车检测等多环节,传统异常管理存在响应滞后、协同混乱、数据缺失三大瓶颈。引入ANDON系统后,通过构建“工位触发-网…...
家庭装修公司网站方案策划2026
你的装修公司网站,是在花钱还是在赚钱?直接问你一个问题:你的网站上个月带来了几条有效询盘?如果你的回答是”不知道”,或者”好像有几条吧,但成单的没有”——那这篇文章你得认真看完。接触过数十家装修公…...
从进度到资源:7款适合PMO的项目集管理系统
本文将深入对比7大项目集管理系统:PingCode、Worktile、GanttPRO、奥博思、TAPD、Trello、氚云 在管理大型、跨部门的复杂项目时,PMO(项目管理办公室)常面临资源冲突、信息孤岛和进度失控的挑战。传统的单项目管理工具已难以承载组…...
Linux内存监控工具与实战技巧
1. Linux 内存监控概述作为一名运维工程师,我每天都要和服务器内存打交道。内存就像系统的血液,一旦出现异常,整个系统就会变得迟缓甚至崩溃。在Linux系统中,我们可以通过多种方式来监控内存使用情况,每种方法都有其独…...
从.nii文件到发表级配图:一份超详细的fMRI脑区(ROI)可视化避坑与调参指南
从.nii文件到发表级配图:一份超详细的fMRI脑区(ROI)可视化避坑与调参指南 当你终于跑完最后一组统计分析,看着屏幕上那些代表显著脑区的彩色斑点时,可能已经迫不及待想把它们放进论文插图。但现实往往是——直接导出的…...
Settingator:嵌入式参数管理库的轻量级设计与实践
1. Settingator 库概述:嵌入式设备与移动端配置协同的工程实践Settingator 是一个面向嵌入式系统的轻量级 Arduino 兼容库,其核心目标并非提供通用通信协议栈,而是构建一套可验证、可回滚、低侵入的运行时参数管理机制,专为配合同…...
零门槛掌握《经济研究》LaTeX模板:从排版小白到学术专家的蜕变指南
零门槛掌握《经济研究》LaTeX模板:从排版小白到学术专家的蜕变指南 【免费下载链接】Chinese-ERJ 《经济研究》杂志 LaTeX 论文模板 - LaTeX Template for Economic Research Journal 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-ERJ 在学术写作的…...
OpenClaw云端体验:星图平台千问3.5-9B镜像快速验证
OpenClaw云端体验:星图平台千问3.5-9B镜像快速验证 1. 为什么选择云端沙盒验证OpenClaw? 第一次接触OpenClaw时,我被它的本地自动化能力吸引,但看到复杂的本地部署文档就打了退堂鼓。直到发现星图平台提供的OpenClaw千问3.5-9B组…...
深入解析OpenPose:从原理到代码实现的完整指南
1. 姿态估计与OpenPose基础认知 想象一下你正在看一段街舞视频,舞者的每个关节运动轨迹都能被自动标注出来——这就是姿态估计技术的魅力。作为计算机视觉领域的经典任务,它的核心目标是检测图像或视频中的人体关键点(如肘部、膝盖等…...
