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

1、介绍

        代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,可以隐藏目标对象的实现细节,增加额外的功能(如访问控制、日志记录、性能监控等),或者对目标对象的访问进行优化。

代理模式组成部分:

        (1)目标对象(Real Subject):代理对象所代表的真实对象,是最终要引用的对象。

        (2)代理对象(Proxy):持有目标对象的引用,控制对目标对象的访问,并可能提供额外的功能。

        (3)客户端(Client):使用代理对象来访问目标对象,通常不会直接访问目标对象。

代理模式的分类:

        (1)远程代理(Remote Proxy):为一个位于不同地址空间的对象提供一个本地的代理对象,这个对象作为该远程对象的代表,以隐藏一个对象存在于不同地址空间的事实。

        (2)虚拟代理(Virtual Proxy):根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象的引用,真实对象只在需要时才会被真正创建。

        (3)保护代理(Protect Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的情况。

        (4)智能引用代理(Smart Reference Proxy):取代了简单的指针,它在访问对象时执行一些附加操作,比如将每一次的访问计数。

2、示例

#include<iostream>
using namespace std;// 抽象角色
class subject
{
public:virtual void Request() = 0 {}
};// 真实角色
class Consubject:public subject
{
public:void Request(); //实现了在抽象角色中定义的方法
};void Consubject::Request() //重载
{cout << "ConRequest" << endl;
}// 代理角色
class Proxy
{
public:Proxy() {}Proxy(subject* sub){m_sub = sub;   //代理角色中定义了一个真实角色对象}~Proxy(){delete m_sub;}void Request()                    //代理角色也实现了抽象角色的方法{cout << "Proxy REQ" << endl;m_sub->Request();            //代理角色调用真实角色的业务方法}
private:subject* m_sub;
};void main()
{subject* sub = new Consubject();   //真实角色对象Proxy* p = new Proxy(sub);         //定义代理对象p->Request();
}

结果:

Proxy REQ
ConRequest

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

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

相关文章

[Python学习篇] Python字符串

字符串是 Python 中最常用的数据类型&#xff0c;一般使用单引号或引号来创建字符串 语法&#xff1a; 字符串变量名A 字符串变量值A 字符串变量名B "字符串变量值B" 示例&#xff1a; a Hello A print(a) b "Hello B" print(b) 字符串特征 一对引号字…

竟然与 package-lock.json 更新有关!部分用户 H5 页面白屏问题!

一.问题 1 场景 现象 接到部分用户反馈进入xxx H5 页面空白&#xff1b; 研发测日志里问题用户的线上页面URL地址可以正常访问&#xff0c;没有复现问题&#xff01;&#xff01;&#xff01; 定位问题 监控平台和客户端日志报错&#xff1a; SyntaxError: Unexpected toke…

调试了一下午,终于把tailwindcss搞进Blazor了

在Vue和Uniapp项目中使用tailwindcss后&#xff0c;实在是太香了&#xff0c;非常符合我这从XAML走过来的老程序员的手感&#xff0c;所以老想着在Blazor项目中引入。看了几个老外大佬的视频&#xff0c;调试了一下午&#xff0c;终于是捣鼓成功了。由于咱们Blazor项目不在node…

STM32硬件接口I2C应用(基于MP6050)

目录 概述 1 STM32Cube控制配置I2C 1.1 I2C参数配置 1.2 使用STM32Cube产生工程 2 HAL库函数介绍 2.1 初始化函数 2.2 写数据函数 2.3 读数据函数 3 认识MP6050 3.1 MP6050功能介绍 3.2 加速计测量寄存器 ​编辑3.3 温度计量寄存器 3.4 陀螺仪测量寄存器 4 MP60…

C++ Windows下Glog日志库安装使用教程

🙋 介绍:glog是google推出的一款轻量级c++开源日志框架。  环境配置:windows+VS2015+gflags 2.2.2+glog-0.3.5。为避免新版本(glog V0.7.1)踏坑,建议装低版本,这里我选用的是V0.3.5。 1. 下载 在gflags官方中下载gflags代码,官方地址 在Glog官方中下载,githut地址:…

简单易用的多功能图床Picsur

什么是 Picsur &#xff1f; Picsur 是一款易于使用、可自行托管的图片分享服务&#xff0c;类似于 Imgur&#xff0c;并内置转换功能。支持多种格式的图片&#xff0c;包括 QOI、JPG、PNG、WEBP&#xff08;支持动画&#xff09;、TIFF、BMP、GIF&#xff08;支持动画&#xf…

Leetcode.2601 质数减法运算

题目链接 Leetcode.2601 质数减法运算 rating : 1779 题目描述 给你一个下标从 0 0 0 开始的整数数组 n u m s nums nums &#xff0c;数组长度为 n n n 。 你可以执行无限次下述运算&#xff1a; 选择一个之前未选过的下标 i i i &#xff0c;并选择一个 严格小于 n u…

第八站:Java银——微服务架构的未来之光

在云原生时代&#xff0c;Java凭借其强大的生态系统和成熟的微服务架构支持&#xff0c;成为了构建现代分布式系统不可或缺的一部分。以下是如何将Java、Docker、Kubernetes、以及Spring Cloud结合起来&#xff0c;构建高效、可扩展的微服务应用的概述&#xff0c;结合简化的代…

初说网络攻防

网络攻防是一个复杂而深入的领域&#xff0c;涉及多方面的技术和策略。以下是关于网络攻防的深入讨论&#xff0c;分点表示和归纳如下&#xff1a; 一、网络攻防的基本概念 网络攻防是指在网络环境下&#xff0c;针对网络和系统存在的漏洞进行攻击和保护的一系列技术和行为。…

下载依赖有问题(只有自己有问题)

有缓存&#xff01; 删除node_modules 命令&#xff1a;npm run clean 前提是该项目支持这个命令&#xff1a;package.json > scripts 内有 clean 例如下面这个就没有clean&#xff0c;则直接手动删除 清除缓存 npm cache clean --force pnpm store prune删除lock文件 …

Superset 二次开发之Git篇 git cherry-pick

Cherry-Pick 命令是 Git 中的一种功能&#xff0c;用于将特定的提交&#xff08;commit&#xff09;从一个分支应用到另一个分支。它允许你选择性地应用某些提交&#xff0c;而不是合并整个分支。Cherry-Pick 非常适合在需要将特定更改移植到其他分支时使用&#xff0c;例如从开…

可视化图表:如此高颜值柱状图,其实简单配置就能实现。

这不又有某个boss给我图截图一些柱状性图表&#xff0c;说他们的前端觉得很难&#xff0c;说了一堆技术术语&#xff0c;他也不懂&#xff0c;截图我看到后&#xff0c;就给了他一个网址&#xff0c;马上就解决了。 在这里给大家摘录出几个比较有特色的柱状图出来&#xff0c;让…

PyTorch计算机视觉入门:使用自己的数据集训练神经网络

前言 计算机视觉&#xff0c;作为人工智能领域的一个重要分支&#xff0c;近年来在图像识别、物体检测、图像生成等应用上取得了显著的进步。PyTorch&#xff0c;作为一款灵活且强大的深度学习框架&#xff0c;为开发者提供了便捷的工具来构建和训练计算机视觉模型。本文将指导…

RFID技术在农产品管理中的应用

使用RFID技术对农产品生产、加工、存储和销售的全过程进行跟踪&#xff0c;追溯食品的生产和加工过程&#xff0c;能够有效加强农产品的管理&#xff0c;如图7—10所示。 将RFID技术应用于农业食品安全&#xff0c;首先是建立完整、准确的食品供应链信息记录。借助RFID 对物体…

Python 全栈系列253 再梳理flask-celery的搭建

说明 最近做了几个实验&#xff0c;将结论梳理一下&#xff0c;方便以后翻看。 1 flask-celery 主要用于数据流的同步任务&#xff0c;其执行由flask-aps发起&#xff0c;基于IO并发的方法&#xff0c;达到资源的高效利用&#xff0c;满足业务上的需求。2 目前部署环境有算网…

腾讯大模型最新路线图,主打一个“实用”

让大模型更接地气&#xff0c;腾讯交出一份阶段性答卷。 大模型狂奔一年多后&#xff0c;正迈向产业落地的深水区。如何用好这一革命性的新技术&#xff0c;已成为整个社会的一道必答题。 去年&#xff0c;国内大模型百花齐放&#xff0c;外界关注的焦点也集中在模型能力上。…

AI Agent智能应用从0到1定制开发(完结)

在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;代理智能应用如同星辰般璀璨&#xff0c;引领着技术革新的潮流。从零开始定制开发一款AI Agent智能应用&#xff0c;就像是在无垠的宇宙中绘制一颗新星的轨迹&#xff0c;每一步都充满了挑战与创新的火花。…

echarts写某个市地图

const geoJSON {"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":440303,"name":"罗湖区","center":[114.123885,22.555341],"…

【2024最新精简版】MyBatis面试篇

文章目录 mybatis内部实现过程mybatis延迟加载请说说MyBatis的工作原理mybatis接口里的方法,参数不同时能重载吗mybatis分页插件的原理是什么&#xff1f;mybatis的一级、二级缓存&#x1f44d;mybatis如何实现多表查询mybatis如何实现批量插入&#x1f44d;mybatis动态SQL标签…

关于使用pycharm中控制台运行代码错误之FileNotFoundError: [Errno 2] No such file or directory:

在使用pycharm环境下复现《python编程&#xff1a;从入门到实践》这本书第16.1.1内容中分析csv文件头一节的代码时出现如下问题&#xff1a; 1、文章中使用的数据来源问题 直接参考本站Kenny C同学的文章提供内容即可。 https://github.com/kenidi8215/Hello-World 打开网页&a…