面试十一、代理模式

        代理模式是一种结构型设计模式,旨在为其他对象提供一种代理或替代方法,以控制对这些对象的访问。在代理模式中,代理对象充当了客户端和目标对象之间的中间人,客户端通过代理访问目标对象,而不直接访问目标对象。

    代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问。代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。代理模式: 通过代理类,来控制实际对象的访问权限客户     助理Proxy     老板(实际对象)委托类*/
#include <iostream>
#include <memory>
class VideoSite{ // 抽象类public:virtual void freeMovie()=0; // 免费电影virtual void vipMovie()=0; // vip电影virtual void ticketMovie()=0; // 用卷看};class FixBugVideoSite :public VideoSite{  // 委托类
public:virtual void freeMovie(){std::cout << "观看免费电影"<< std:: endl;}virtual void vipMovie(){std::cout << "观看vip电影"<< std:: endl;}virtual void ticketMovie(){std::cout << "用卷免费电影"<< std:: endl;}
};// 代理类 代理FixBugVideoSite
class FreeVideoSiteProxy:public VideoSite{
public:FreeVideoSiteProxy(){pVideo =new FixBugVideoSite();}~FreeVideoSiteProxy(){delete pVideo ;}virtual void freeMovie(){pVideo->freeMovie(); // 通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法}virtual void vipMovie(){std::cout << "您目前师普通用户,看不了观看vip电影"<< std:: endl;}virtual void ticketMovie(){std::cout << "您目前师普通用户,用卷看免费电影"<< std:: endl;}
private:VideoSite *pVideo;
};class VipVideoSiteProxy:public VideoSite{
public:VipVideoSiteProxy(){pVideo =new FixBugVideoSite();}~VipVideoSiteProxy(){delete pVideo ;}virtual void freeMovie(){pVideo->freeMovie(); // 通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法}virtual void vipMovie(){pVideo->vipMovie();}virtual void ticketMovie(){std::cout << "您目前没有卷"<< std:: endl;}
private:VideoSite *pVideo;
};// 这些都是通用的API接口,使用的都是基类的指针
void watchMovie(std::unique_ptr<VideoSite> &ptr){ptr->freeMovie();ptr->vipMovie();ptr->ticketMovie();
}int main(){// 这样需要在这里判断,是否够够看vip电影比较麻烦,需要是由委托类来搞std::unique_ptr<VideoSite> p1 (new FreeVideoSiteProxy());std::unique_ptr<VideoSite> p2 (new VipVideoSiteProxy());watchMovie(p1);watchMovie(p2);return 0;
}

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

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

相关文章

【C++】为什么vector的地址与首元素地址不同?

文章目录 一、问题发现&#xff1a;二、结果分析三、问题解析 一、问题发现&#xff1a; &vector和&vector[0]得到的两个地址居然不相同&#xff0c;对数组array取变量名地址和取首元素地址的结果是相同的。这是为啥呢&#xff1f; 使用下面代码进行验证&#xff1a;…

Oracle中全表扫描优化方法

在Oracle数据库中&#xff0c;全表扫描&#xff08;Full Table Scan, FTS&#xff09;是指查询执行时扫描表的所有数据块来获取结果集。虽然在某些场景下全表扫描可能是最优选择&#xff08;例如&#xff1a;当需要访问大部分或全部数据、表很小或者索引访问成本高于全表扫描时…

MKdocs博客中文教程 - 已经整理到知乎专栏

MKdocs博客中文教程 - 知乎 Mkdocs-Wcowin中文主题 通过主题和目录以打开文章 基于Material for MkDocs美化简洁美观&#xff0c;功能多元化简单易上手&#xff0c;小白配置教程详细&#xff0c;清晰易懂

html5cssjs代码 035 课程表

html5&css&js代码 035 课程表 一、代码二、解释基本结构示例代码常用属性样式和装饰响应式表格辅助技术 一个具有亮蓝色背景的网页&#xff0c;其中包含一个样式化的表格用于展示一周课程安排。表格设计了交替行颜色、鼠标悬停效果以及亮色表头&#xff0c;并对单元格设…

C++基础之运算符重载续(十三)

一.函数调用运算符 我们知道&#xff0c;普通函数执行时&#xff0c;有一个特点就是无记忆性&#xff0c;一个普通函数执行完毕&#xff0c;它所在的函数栈空间就会被销毁&#xff0c;所以普通函数执行时的状态信息&#xff0c;是无法保存下来的&#xff0c;这就让它无法应用在…

python实现 linux 执行命令./test启动进程,进程运行中,输入参数s, 再输入参数1, 再输入参数exit, 获取进程运行结果重定向写入到文件

要在 Python 中实现执行 ./test 启动进程&#xff0c;并在进程运行中依次输入参数 s、1&#xff0c;最后输入参数 exit&#xff0c;并将进程的输出结果重定向写入到文件&#xff0c;你可以使用 subprocess 模块。以下是一个示例代码&#xff1a; import subprocess# 启动 test…

MoonBit 首场 MeetUp 活动火热报名中!更多活动惊喜等你来探索!

首场线下MeetUp来啦&#xff01; 在数字化浪潮中&#xff0c;基础软件构筑了信息产业发展的根基&#xff0c;不仅是技术进步的支柱&#xff0c;也是推动经济增长的重要力量。基础软件的发展不仅关乎硬件的完善与应用软件的创新&#xff0c;更是连接过去与未来的桥梁。 尽管中国…

Docker容器化技术(docker-compose安装部署案例)

docker-compose编排工具 安装docker-compose [rootservice ~]# systemctl stop firewalld [rootservice ~]# setenforce 0 [rootservice ~]# systemctl start docker[rootservice ~]# wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-…

anaconda迁移深度学习虚拟环境 在云服务器上配置

1 anaconda 虚拟环境操作 1、 查看虚拟环境 conda info -e2、 创建新的虚拟环境 conda create -n deeplearning_all pip python3.63、 激活新建的虚拟环境 Conda activate deeplearning_all2 环境中相关库的版本即安装说明&#xff08;这些库都是对应匹配的&#xff09; …

Lenze伦茨8400变频器E84A L-force Drives 操作使用说明

Lenze伦茨8400变频器E84A L-force Drives 操作使用说明

跟selenium并肩的自动化神器 Playwright 的 Web 自动化测试解决方案

1. 主流框架的认识 总结&#xff1a; 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化&#xff0c;因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三…

JavaEE 初阶篇-深入了解操作系统中的进程与 PCB

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 关于计算机是如何进行工作的 “常识” 1.1 关于寄存器、缓存与内存是如何配合 CPU “工作” 2.0 操作系统概述 2.1 操作系统内核 2.2 进程 2.3 PCB 2.3.1 PCB 属性…

Centos7没有可用软件包 ifconfig问题解决

问题描述 在Centos7中查看ip没有ifconfig&#xff0c;使用yum安装ifconfig报错没有可用软件包 ifconfig问题解决 [rootlocalhost etc]# yum -y install ifconfig 已加载插件&#xff1a;fastestmirror base …

动手做简易版俄罗斯方块

导读&#xff1a;让我们了解如何处理形状的旋转、行的消除以及游戏结束条件等控制因素。 目录 准备工作 游戏设计概述 构建游戏窗口 游戏方块设计 游戏板面设计 游戏控制与逻辑 行消除和计分 判断游戏结束 界面美化和增强体验 看看游戏效果 准备工作 在开始编码之前…

火灾自动报警及消防联动控制系统主机的九个主要组成部分

关于火灾报警联动系统的主机组成&#xff0c;一般有两种不同的概括&#xff0c;下面分别讨论。 一&#xff1a; 火灾报警主机的组成部分较多&#xff0c;主要包括以下消防设备&#xff1a;主电源、联动电源、打印机、驱动器、直接控制板、总线控制板、消防广播、消防电话主机…

粒子群算法 - 目标函数最优解计算

粒子群算法概念 粒子群算法 (particle swarm optimization&#xff0c;PSO) 由 Kennedy 和 Eberhart 在 1995 年提出&#xff0c;该算法模拟鸟群觅食的方法进行寻找最优解。基本思想&#xff1a;人们发现&#xff0c;鸟群觅食的方向由两个因素决定。第一个是自己当初飞过离食物…

FPGA工程正确的设计流程

1 正确的设计流程 分析项目的具体需求来设计系统的结构&#xff0c;划分系统的层次&#xff0c;确定各个子模块的结构关系和信号之间的相互关系&#xff0c;然后确定模块的端口信号等根据每隔模块的功能和自己的理解&#xff0c;结合芯片手册接口的时序&#xff0c;使用visio画…

基于QGraphicsView的图像显示控件,支持放大、缩小、鼠标拖动

原链接 前言 这是一个Qt平台的基于QGraphicsView类的图像显示控件&#xff0c;支持输入QPixmap、QImage、opencv的从cv::Mat类。 实现平台&#xff1a;Windows 10 x64 Qt 6.2.3 MSVC 2019 opencv 4.5 先来看演示视频 控件类实现 ImageViewer.h文件 #ifndef IMAGEVIEWER…

error: C preprocessor fails sanity check

问题 ./configure --prefix/opt/mips_lib/libev --hostmipsel-openwrt-linux CCmipsel-openwrt-linux-gcc运行后提示 checking how to run the C preprocessor... mipsel-openwrt-linux-gcc --sysroot/opt/mt7628/toolchain-mipsel_24kc_gcc-8.4.0_musl -I/opt/mt7628/toolch…

Docker 笔记(八)--Dockerfile

目录 1. 背景2. 参考3. 原文3.1 Dockerfile 支持的指令3.2 Dockerfile格式3.3 Parser指令syntaxescape 3.4 环境变量替换3.5 docker构建忽略文件3.6 Shell 和 exec 格式Exec 格式Shell 格式使用不同的 shell 3.7 FROM指令了解ARG和FROM如何交互 3.8 RUN指令RUN指令缓存失效RUN …