当前位置: 首页 > news >正文

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类可不必关心业务权限的问题,只需开发不同种类的电影观看业务即可,而电影的观看权限则控制则由代理类完成,使用不同的代理类即可控制不同用户不同电影的观看权限

相关文章:

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

作用 代理模式主要用于&#xff0c;通过代理类&#xff0c;来控制实际对象的访问权限 案例 class VideoSite { public:virtual void freeVideo()0;virtual void vipVideo()0;virtual void trickVideo()0; };class FixBugVideoSite:public VideoSite { public:void freeVideo()…...

第5个-模糊加载

Day 5 - Blurry Loading 1. 项目展示 2. 分析思路 变化过程 数字从 0 不断增长到 100&#xff1b;中间的百分比数字逐渐消失&#xff0c;即透明度 opacity 从 1 到 0&#xff1b;背景图片从模糊变为清晰&#xff0c;滤镜 filter.blur()的参数设置为从 30px 到 0px。 小 tips…...

rtt设备io框架面向对象学习-adc设备

目录 1.adc设备基类2.adc设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.adc设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的adc.h定义了如下adc设备基类 struct rt_ad…...

面试官:介绍一下Exception和Error之间的区别

前言 大家好&#xff0c;我是chowley&#xff0c;在我之前的面试中&#xff0c;遇到过这样一个问题&#xff1a;Exception和Error之间有什么区别&#xff1f;今天我就来好好地总结一下&#xff01; 主体 在Java编程中&#xff0c;Exception和Error都是Java中的可抛出对象&am…...

【RabbitMQ(一)】:基本介绍 | 配置安装与快速入门

应该是新年前最后一篇博客了&#xff0c;明天浅浅休息一下&#xff0c;提前祝大家新年快乐捏&#xff01;&#x1f60a;&#x1f60a;&#x1f60a; 01. 基础理解 1.1 同步调用和异步调用 &#x1f449; 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成&#xff…...

ElasticSearch之search API

写在前面 本文看下查询相关内容&#xff0c;这也是我们在实际工作中接触的最多的&#xff0c;所以有必要好好学习下&#xff01; 1&#xff1a;查询的分类 主要分为如下2类&#xff1a; 1:基于get查询参数的URI search 2&#xff1a;基于post body的request body search&am…...

07-Java桥接模式 ( Bridge Pattern )

Java桥接模式 摘要实现范例 桥接模式&#xff08;Bridge Pattern&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化 桥接模式涉及到一个作为桥接的接口&#xff0c;使得实体类的功能独立于接口实现类&#xff0c;这两种类型的类可被结构化改变而互不影…...

golang集成sentry: go-redis

网上没有找到go-redis集成sentry的库&#xff0c; 所以我简单实现了一个 代码&#xff1a; https://github.com/Shujie-Tan/go-redis-sentry 使用方法&#xff1a; import (redis_sentry "github.com/Shujie-Tan/go-redis-sentry" ) rdb : redis.NewClient(&re…...

用EXCEL从地址(上海)中提取各区(浦东新区等区)信息

背景&#xff1a; 朋友工作需要经常用EXCEL把各上海用户收货地址中的区提取出来&#xff0c;之前一直手动处理&#xff0c;希望我帮忙用EXCEL公式直接提取处理。 数据样式&#xff1a; 中国上海市浦东新区A小区 上海徐汇区B小区 中国&#xff0c;上海&#xff0c;浦东新区&a…...

关于在分布式环境中RVN和使用场景的介绍3

简介 在《关于在分布式环境中RVN和使用场景的介绍2》和《关于在分布式环境中RVN和使用场景的介绍1》中我们介绍了RVN的概念和在一些具体用例中的使用。在本文中我们讨论一下在分布式环境中使用RVN需要注意的问题。 问题 我们在收到一条待处理的事件时&#xff0c;需要检查该…...

计算最小公倍数math.lcm()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算最小公倍数 math.lcm() 请问以下代码输出的结果是&#xff1f; import math print("【执行】math.lcm(2, 4)") print(math.lcm(2, 4)) print("【执行】math.lcm(1, 2, 3…...

VUE SEO 几种方案经典面试题

1、SSR服务器渲染 Vue.js 是构建客户端应用程序的框架。默认情况下&#xff0c;可以再浏览器中输出Vue组件&#xff0c;进行生成DOM和操作DOM。然而&#xff0c;也可以将同一个组件渲染未服务器端的HTML字符串&#xff0c;将它们直接发送到浏览器&#xff0c;最后将这些静态标…...

Python和VBA批量提取Word中的表格

表格在word文档中常见的文档元素之一。操作word文件时有时需要提取文件中多个表格的内容到一个新的文件&#xff0c;甚至有时还会要提取题注信息。 今天&#xff0c;给大家分享两种批量提取文档中表格的两种方法&#xff0c;分别是VBA法和Python法两种。 一、VBA法提取word中…...

Swift Combine 有序的异步操作 从入门到精通十二

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…...

国产航顺HK32F030M: 超声波测距模块串口通信数据接收与处理

参考代码 /************************************************************************************************** * file usart_async_tx_no_int_rx_rxneint.c * brief 异步串口通信例程, 通过查询TXE标志发送数据,通过RXNE中断接收数据,当中断接收到数据后会将 * …...

idea:如何连接数据库

1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填&#xff0c;用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库&#xff0c;点击运用ok&#xff0c;等待刷新即可 最后&#xff1a…...

JS中ES5和ES6的区别

前言 ES5是JavaScript的第五个修订版本&#xff0c;于2009年发布。而ES6是JavaScript的第六个修订版本&#xff0c;也称为ES2015&#xff0c;于2015年发布。以下是它们两个版本之前的一些区别&#xff1a; 变量声明方式 在ES5中&#xff0c;使用var关键字进行变量声明&#…...

软考24-上午题-图1

一、数据结构的回忆 线性结构&#xff1a;&#xff08;一对一&#xff09; 除首结点没有前驱、末尾结点没有后继外&#xff0c;一个结点只有唯一的一个直接前驱和唯一的一个直接后继。 树结构&#xff1a;&#xff08;一对多&#xff09; 除根节点没有前驱节点外&#xff0c;…...

书生·浦语大模型第四课作业

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 1.安装 # 如果你是在 Int…...

勒索攻击风起云涌,Sodinokibi深度分析

前言 Sodinokibi勒索病毒&#xff0c;又称为REvil勒索病毒&#xff0c;这款勒索病毒最早在国内被发现是2019年4月份&#xff0c;笔者在早期分析这款勒索病毒的时候就发现它与其他勒索病毒不同&#xff0c;于是被笔者称为GandCrab勒索病毒的“接班人”&#xff0c;为什么它是Ga…...

开源阅读工具资源维护全指南:从故障诊断到主动防御

开源阅读工具资源维护全指南&#xff1a;从故障诊断到主动防御 【免费下载链接】Yuedu &#x1f4da;「阅读」APP 精品书源&#xff08;网络小说&#xff09; 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 开源阅读工具作为获取网络文学资源的重要途径&#xff0…...

Python3.9实战应用:数据分析环境搭建与常用库安装指南

Python3.9实战应用&#xff1a;数据分析环境搭建与常用库安装指南 1. 引言 Python作为数据科学领域的首选语言&#xff0c;其3.9版本在性能和功能上都为数据分析工作提供了坚实基础。本文将带你从零开始搭建一个专业的数据分析环境&#xff0c;涵盖Miniconda环境配置、Jupyte…...

从逗号到标签:用React 19 + TailwindCSS V4构建智能选项解析器

1. 为什么需要智能标签解析器&#xff1f; 在日常开发中&#xff0c;我们经常遇到这样的场景&#xff1a;用户需要输入多个选项&#xff0c;比如商品标签、兴趣关键词或者任务分类。传统做法是让用户手动输入每个标签后按回车&#xff0c;这种体验既笨拙又低效。而一个优秀的智…...

手把手教你用Qwen2.5-7B-Instruct:基于vllm+chainlit快速搭建智能助手

手把手教你用Qwen2.5-7B-Instruct&#xff1a;基于vllmchainlit快速搭建智能助手 想快速拥有一个属于自己的、功能强大的智能对话助手吗&#xff1f;今天&#xff0c;我们就来一起动手&#xff0c;基于Qwen2.5-7B-Instruct这个优秀的开源大模型&#xff0c;配合vLLM的高效推理…...

如何使用NoFences实现高效的Windows桌面图标管理

如何使用NoFences实现高效的Windows桌面图标管理 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences NoFences是一款开源免费的Windows桌面管理工具&#xff0c;专门用于解决桌面…...

VideoCombine节点故障急救:6个非典型解决方案助你恢复视频合成功能

VideoCombine节点故障急救&#xff1a;6个非典型解决方案助你恢复视频合成功能 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 在视频创作的关键环节&#xff0c;…...

告别单调按钮:用ImageButton和StateListDrawable打造高交互感的Android应用图标按钮

从静态到动态&#xff1a;用StateListDrawable构建专业级交互按钮系统 在移动应用界面设计中&#xff0c;按钮是最基础却最关键的交互元素之一。一个优秀的按钮设计不仅需要视觉上的吸引力&#xff0c;更需要通过细腻的状态反馈来建立用户与应用的对话机制。传统静态按钮早已无…...

OpenClaw+GLM-4.7-Flash自动化写作:3小时生成30篇技术笔记实战

OpenClawGLM-4.7-Flash自动化写作&#xff1a;3小时生成30篇技术笔记实战 1. 为什么需要自动化知识管理 作为一个技术博主&#xff0c;我每天需要消化大量技术文档和论文。过去两年里&#xff0c;我尝试过各种笔记工具——从Notion到Obsidian&#xff0c;从语雀到飞书文档。但…...

OFA-Image-Caption模型服务监控与告警体系搭建

OFA-Image-Caption模型服务监控与告警体系搭建 你辛辛苦苦把那个能看懂图片并生成描述的OFA模型部署上线了&#xff0c;业务方用得很开心&#xff0c;每天处理着成千上万的图片。但某天深夜&#xff0c;你突然被电话吵醒&#xff1a;“服务挂了&#xff01;所有图片都卡住了&a…...

Qwen3-Reranker-8B企业落地:保险条款智能比对系统重排模块部署

Qwen3-Reranker-8B企业落地&#xff1a;保险条款智能比对系统重排模块部署 1. 项目背景与需求场景 保险行业每天需要处理大量的条款文档比对工作&#xff0c;比如新老条款对比、不同产品条款差异分析、合规性检查等。传统的人工比对方式效率低下&#xff0c;容易出错&#xf…...