[C/C++] -- 代理模式
代理模式是一种结构型设计模式,允许一个对象(代理)控制另一个对象的访问。代理对象通常充当客户端和实际目标对象之间的中间人,从而控制对目标对象的访问,可以在访问前后进行一些额外的处理。
代理模式的优点包括:
- 控制对目标对象的访问:代理对象可以控制客户端对目标对象的访问,可以在访问前后进行一些额外的处理,如权限验证、缓存等。
- 增强目标对象的功能:代理对象可以在不修改目标对象的情况下,通过代理对象来增强目标对象的功能,例如添加日志记录、性能监控等。
- 解耦:代理模式可以将客户端与目标对象解耦,客户端无需知道目标对象的具体实现,只需要与代理对象进行交互。
代理模式的缺点包括:
- 增加了系统复杂度:引入了代理对象会增加系统的复杂度,增加了额外的代码量。
- 性能开销:在某些情况下,代理模式可能会引入额外的性能开销,特别是动态代理。

#include <iostream>
#include <memory>
using namespace std;/*
代理Proxy模式: 通过代理类,来控制实际对象的访问权限
客户 助理Proxy 老板 委托类
*/
class VideoSite //1、抽象类
{
public:virtual void freeMovie() = 0; //免费电影virtual void vipMovie() = 0; //VIP电影virtual void ticketMovie() = 0; //用券观看电影
};
class FixBugVideoSite:public VideoSite//2、委托类
{
public:virtual void freeMovie() //免费电影{cout << "观看免费电影" << endl;}virtual void vipMovie() //VIP电影{cout << "观看VIP电影" << endl;}virtual void ticketMovie() //用券观看电影{cout << "用券观看电影" << endl;}
};
//3.代理类
class FreeVideoSiteProxy:public VideoSite
{
public:FreeVideoSiteProxy(){pVideo = new FixBugVideoSite();}~FreeVideoSiteProxy(){delete pVideo;}virtual void freeMovie() //免费电影{pVideo->freeMovie(); //通过代理对象的freeMovie,访问真正委托类对象的freeMovie}virtual void vipMovie() //VIP电影{cout << "只是普通游客,需要升级成VIP,才能观看VIP电影" << endl;}virtual void ticketMovie() //用券观看电影{cout << "充值购买券,才能观看VIP电影" << endl;}
private:VideoSite *pVideo;
};
//3.代理类
class VipVideoSiteProxy:public VideoSite
{
public:VipVideoSiteProxy(){pVideo = new FixBugVideoSite();}~VipVideoSiteProxy(){delete pVideo;}virtual void freeMovie() //免费电影{pVideo->freeMovie(); //通过代理对象的freeMovie,访问真正委托类对象的freeMovie}virtual void vipMovie() //VIP电影{pVideo->vipMovie();}virtual void ticketMovie() //用券观看电影{cout << "充值购买券,才能观看VIP电影" << endl;}
private:VideoSite *pVideo;//4.用组合的方式使用代理对象
};//这些都是通用的API接口,使用的都是基类的指针或引用
void watchMovie(unique_ptr<VideoSite> &ptr)
{ptr->freeMovie();ptr->vipMovie();ptr->ticketMovie();
}
int main()
{unique_ptr<VideoSite> p1(new FreeVideoSiteProxy());//5.客户直接访问代理对象unique_ptr<VideoSite> p2(new VipVideoSiteProxy());watchMovie(p1);watchMovie(p2);return 0;
}相关文章:
[C/C++] -- 代理模式
代理模式是一种结构型设计模式,允许一个对象(代理)控制另一个对象的访问。代理对象通常充当客户端和实际目标对象之间的中间人,从而控制对目标对象的访问,可以在访问前后进行一些额外的处理。 代理模式的优点包括&…...
电商平台遭遇DDOS、CC攻击有什么防护方案
电商平台遭遇DDOS、CC攻击有什么防护方案?在数字化浪潮的推动下,电商平台已成为现代商业的重要组成部分,为消费者提供便捷、多样的购物体验。然而,随着业务的发展,电商平台也面临着日益严峻的网络安全挑战,…...
什么是 IIS
什么是 IIS 一、什么是 IIS二、IIS 的功能三、IIS 几点说明四、IIS 的版本五、IIS 常见的组合 欢迎关注【云边小网安】 一、什么是 IIS IIS:指 Internet Information Services ,是一种由微软公司开发的 Web 服务器应用程序。IIS:是一种 Web …...
京东页面(黏性定位的实现)
前言: 本文章将分享一些我这周在制作京东页面的实现部分,页面表面大体和京东页面差不多,在里面加了一点script,但是很容易理解,希望大家看到可以有所收获,如果我有哪部分写的不太好,欢迎大家来跟我交流! 🥰个人主页:心.c 🥳文章专题:京东页面制作 &#…...
【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第6章 安装Samba
RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…...
json-server 模拟接口服务
前端开发经常需要模拟接口请求,可以通过 json-server 实现。 1. 安装 json-server 在前端项目的终端命令行中执行 npm i json-server2. 创建数据源 在项目中新建文件 db.json ,与 package.json 同级,内容为模拟的数据 注意 json 文件对格式…...
pycharm 将项目连同库一起打包及虚拟环境的使用
目录 一、创建虚拟环境 1、用 anaconda 创建 2、Pycharm 直接创建 二、虚拟环境安装第三方库 1、创建项目后,启动终端(Alt F12),或者点击下方标记处。 2、使用 pip 或者 conda 来进行三方库的安装或卸载 3、将项目中的库放入文档,便于…...
GO语言核心30讲 实战与应用 (第三部分)
原站地址:Go语言核心36讲_Golang_Go语言-极客时间 一、io包中的接口和工具 1. strings.Builder、strings.Reader 和 bytes.Buffer 这些类型实现了 io 包的很多接口,目的是什么? 是为了提高不同程序实体之间的互操作性。 程序实体是指比如网…...
HttpServletRequest对象
1.作用 主要作用是用来接收客户端发送过来的请求信息,由servlet容器封装好传递给service()方法 2.常用方法 常用方法描述StringBuffer getRequestURL()获取客户端发送请求时的完整URLString getRequestURI()获取请求行中的资源名称部分(项目名称开始&…...
Linux入门攻坚——23、DNS和BIND基础入门1
DNS——Domain Name Service,协议(C/S,53/udp,53/tcp) BIND——Berkeley Internet Name Domain,ISC(www.isc.org) 互联网络上主机之间的通信依靠的是IP,而人或程序一般使…...
springboot中mybatisplus注意事项
使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…...
Android Ant编译环境配置(Win)
1、 载ant包: 2、设置环境变量: 3、检查是否设置成功及版本 4、执行命令: android update project -p . -n “projectname”(例如:android update project --target 1 -p . -n “Couplet”)(只输入红色部分也是可以的…...
条件变量解决同步问题之打印金鱼
说明 本代码为jyy老师上课演示条件变量解决同步问题示例(本人只做记录与分享) 本人未使用老师封装的POSIX线程库, 直接在单文件中调试并注释 问题描述 有三类线程 T1 若干: 死循环打印< T2 若干: 死循环打印> T3 若干: 死循环打印_ 任务: 对线程同步,使得屏幕…...
10分钟了解Golang泛型
泛型是Golang在1.18版本引入的强大工具,能够帮助我们在合适的场合实现简洁、可读、可维护的代码。原文: Go Generics: Everything You Need To Know 导言 可能有人会觉得Go泛型很难,因此想要借鉴其他语言(比如Java、NodeJS)的泛型…...
鸿蒙内核源码分析(Shell解析篇) | 应用窥视内核的窗口
系列篇从内核视角用一句话概括shell的底层实现为:两个任务,三个阶段。其本质是独立进程,因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry): 负责接受来自终端(控制台)敲入的一个个字符&…...
TypeScript在前端项目的渐进式采用策略
渐进式采用 TypeScript 在前端项目中的策略通常包括: 引入TypeScript 如果我们有一个简单的JavaScript模块utils.js,它包含一个函数用于计算两数之和: // utils.js export function add(a, b) {return a b; }首先,我们将文件扩展名改为.t…...
C++容器常用集合(附传送门)
C常用的容器: string容器 C容器——string-CSDN博客 储存字符串的 vector容器 C容器——vector-CSDN博客 向量是动态数组,可以自动扩展以容纳更多元素。 插入和删除元素的时间复杂度取决于操作的位置 tuple容器(元组) C容器…...
基于springboot的校园资料分享平台源码数据库
基于springboot的校园资料分享平台源码数据库 随着信息互联网购物的飞速发展,国内放开了自媒体的政策,一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求,创…...
卷积神经网络(CNN)
大家好,这里是七七,今天来更新关于CNN相关的内容同了。本文是针对CNN原理的说明,但对于小白不是非常友好,建议先掌握神经网络相应知识再进行阅读哦。 一、卷积与互相关 卷积 卷积运算是对两个函数进行的一种数学运算,…...
Linux入门攻坚——22、通信安全基础知识及openssl、CA证书
Linux系统常用的加解密工具:OpenSSL,gpg(是pgp的实现) 加密算法和协议: 对称加密:加解密使用同一个秘钥; DES:Data Encryption Standard,数据加密标准&…...
一键获取九大网盘真实下载地址:LinkSwift网盘直链下载助手完整指南
一键获取九大网盘真实下载地址:LinkSwift网盘直链下载助手完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动…...
Python点云处理入门:从零开始用pypcd4库读取.pcd文件并可视化(附完整代码)
Python点云处理入门:从零开始用pypcd4库读取.pcd文件并可视化 点云数据正逐渐成为三维感知领域的通用语言,从自动驾驶的环境建模到工业质检的精密测量,这些由数百万个空间点构成的数据集正在重塑我们与物理世界交互的方式。对于刚接触这一领域…...
CS188 Note3 学习笔记
更好的阅读体验 Informed Search(启发式搜索) 原文解释 If we have some notion of the direction in which we should focus our search, we can significantly improve performance and “hone in” on a goal much more quickly. This is exactly the focus of informed …...
3个步骤掌握LevelUI:可视化LevelDB数据库管理新体验
3个步骤掌握LevelUI:可视化LevelDB数据库管理新体验 【免费下载链接】levelui A GUI for LevelDB management based on atom-shell. 项目地址: https://gitcode.com/gh_mirrors/le/levelui 还在为LevelDB的命令行操作而烦恼吗?LevelUI为你带来了全…...
从门电路到芯片:拆解一个D触发器,看数字电路如何实现‘记忆’这个核心功能
从门电路到芯片:拆解一个D触发器,看数字电路如何实现‘记忆’这个核心功能 数字世界的每一个比特信息都需要被精确存储和传递,而实现这一功能的核心元件便是触发器。当我们按下电脑的电源键,屏幕上闪现的第一个像素到硬盘中保存的…...
将taotoken作为统一api层整合到企业内部多个ai应用场景中
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 将taotoken作为统一api层整合到企业内部多个ai应用场景中 在企业内部,AI应用正变得无处不在。从智能客服系统自动回复用…...
BepInEx框架指南:从游戏玩家到模组开发者的完整升级路径
BepInEx框架指南:从游戏玩家到模组开发者的完整升级路径 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 你是否曾经羡慕过那些能够为游戏添加新内容、修改界面、甚至创…...
最火的知识付费系统小程序+PC+H5三端数据互通支持采集资源开源版
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 系统含带 裂变模式 可以助力好友来获取资源共享 分站功能 独立后台 会员功能 卡密功能 二级分销功能等 自行研究看 后期有更新新版会在持续发布 目前版本是3.5 是我花三天时间修复的 好多…...
淘宝淘金币自动化脚本:5分钟完成每日任务,解放双手的时间管理方案
淘宝淘金币自动化脚本:5分钟完成每日任务,解放双手的时间管理方案 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors…...
D1016UK,1MHz至1GHz宽带适用的低噪声高效率射频功率晶体管
简介今天我要向大家介绍的是 TT Electronics/Semelab 的DMOS RF FET晶体管——D1016UK。这是一款专为VHF/UHF通信频段(1 MHz至1GHz)设计的金金属化多用途硅RF功率场效应管,采用推挽式架构,在28V工作电压下可提供40W的输出功率。作…...
