【C++】—— 代理模式

news2025/1/23 7:13:45

目录

(一)什么是代理模式

(二)为什么使用代理模式

(三)代理模式实现步奏

(四)代码示例

(五)代理模式优缺点


(一)什么是代理模式

代理模式指代理控制对其他对象的访问,也就是代理对象控制对原对象的引⽤。在某些情况下,⼀个对象不适合或者不能直接被引⽤访问,⽽代理对象可以在客⼾端和⽬标对象之间起到中介的作⽤。


(二)为什么使用代理模式

  1. 增加额外功能:在不修改真实对象代码的前提下,可以通过代理在访问真实对象时添加额外的功能,如缓存、日志记录、延迟加载、性能监测等。

  2. 接口隔离:如果某个对象的接口过于复杂或不希望暴露给客户端,可以使用代理模式提供一个简单的接口进行访问,从而隔离复杂性。

  3. 智能引用:代理可以控制对象的生命周期,实现智能指针的功能,比如引用计数,自动释放不再使用的对象等。

代理模式的作用: AOP实现,拦截器,中介,黄牛,解耦,专人做专事。

  • AOP:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一 种技术。

(三)代理模式实现步奏

代理模式的实现步骤如下:

  • 提供一个抽象主题角色:真实主题与代理主题的共同接口
  • 提供一个真实主题角色:定义了代理角色所代表的真实对象
  • 提供一个代理主题角色:含有对真实主题角色的引用

【解释说明】

代理模式的结构包括⼀个是真正的你要访问的对象(⽬标类)、⼀个是代理对象。⽬标对象与代理对象实现同⼀个接⼝,先访问代理类再通过代理类访问⽬标对象。代理模式分为静态代理、动态代理:

  • 静态代理指的是,在编译时就已经确定好了代理类和被代理类的关系。也就是说,在编译时就已经确定了代理类要代理的是哪个被代理类。
  • 动态代理指的是,在运⾏时才动态⽣成代理类,并将其与被代理类绑定。这意味着,在运⾏时才能确定代理类要代理的是哪个被代理类。

(四)代码示例

场景

  • 以租房为例,房东将房⼦租出去,但是要租房⼦出去,需要发布招租启⽰,带⼈看房,负责维修,这些⼯作中有些操作并⾮房东能完成,因此房东为了图省事,将房⼦委托给中介进⾏租赁。

代理模式实现:

  •  房东要把⼀个房⼦通过中介租出去理解代理模式
#include <iostream>
#include <string>

class RentHouse {
public:
    virtual void rentHouse() = 0;
};
  • 房东类:将房⼦租出去 
class Landlord : public RentHouse {
public:
    void rentHouse() {
        std::cout << "将房⼦租出去\n";
    }
};
  •  中介代理类:对租房⼦进⾏功能加强,实现租房以外的其他功能
class Intermediary : public RentHouse {
public:
    void rentHouse() {
    std::cout << "发布招租启⽰\n";
    std::cout << "带⼈看房\n";
    _landlord.rentHouse();
    std::cout << "负责租后维修\n";
}
private:
    Landlord _landlord;
};

主函数:

int main()
{
    Intermediary intermediary;
    intermediary.rentHouse();
    return 0;
}

 


(五)代理模式优缺点

优点:

  1. 代理模式可以控制对真实对象的访问,实现权限控制,保护真实对象的安全性。
  2. 高扩展性:具体主题角色可变。

缺点:

  1. 引入代理模式会增加系统的复杂性,在访问真实对象时,代理会增加一层间接调用,可能会导致性能开销。
  2. 如果系统中存在大量的真实对象,可能会导致代理类的数量过多,增加系统的复杂性和维护成本。

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

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

相关文章

为什么选择VR全景进行企业宣传,如何将VR全景运用在企业展示

引言&#xff1a; 随着科技的不断发展&#xff0c;VR全景技术逐渐成为企业宣传的热门选择。那么&#xff0c;为什么越来越多的企业选择使用VR全景技术进行宣传呢&#xff1f; 一&#xff0e;为什么选择VR全景技术进行企业宣传 1. 提升用户体验 VR全景技术可以为用户营造身临…

<Linux> 线程控制

目录 一、线程资源的分配 &#xff08;一&#xff09;线程私有资源 &#xff08;二&#xff09;线程共享资源 二、原生线程库 三、线程控制接口 &#xff08;一&#xff09;线程创建 - pthread_create() 1. 一个线程 2. 一批线程 &#xff08;二&#xff09;线程等待 …

从零开始,一步步构建服务网格istio

一、环境情况 环境&#xff1a;Ubuntu20.04 机器数量&#xff1a;单机1台 IP&#xff1a;10.9.2.83 二、准备知识 为什么使用 Istio&#xff1f; Istio提供了一种更高级别的服务网格解决方案&#xff0c;它可以简化和加强 Kubernetes 集群中的服务间通信、流量管理、安全…

泛微E9开发 限制明细表的行数,要求必须填写n行才能提交

通过设置明细表属性实现 关闭“允许新增明细”、“允许删除已有明细”功能开启“新增默认空明细”功能&#xff0c;并设置初始值为n 新增时的流程加载页面 通过代码块实现 <script>jQuery(document).ready(function(){ debugger;//新增行前执行代码WfForm.regist…

软件测试知识面试题:白盒测试、黑盒测试、测试用例

文章目录 白盒测试1、白盒测试分两类2、白盒测试的四个原则3、白盒测试常用的7类测试 黑盒测试1、黑盒测试的优缺点2、黑盒测试的方法3、黑盒测试的原则 测试用例1、测试用例包含2、设计测试用例所需的文档资料3、采用白盒测试技术设计用例的目的4、采用黑盒测试技术设计用例的…

【Java探索之旅】解密Java中的类型转换与类型提升

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、类型转化1.1 自动类型转换&#xff08;隐式类型转换&#xff09;1.2 强制类型转换…

实体店新模式:线下正规实体门店的转型与升级策略

在当今竞争激烈的市场环境下&#xff0c;线下正规实体门店需要不断转型与升级&#xff0c;以适应消费者的需求和市场的变化。 作为一名开鲜奶吧5年的创业者&#xff0c;我见证了无数实体店的成功与失败&#xff0c;下面的文章我将通过具体案例&#xff0c;为大家分享一些实用的…

[WiFi] 802.11w/802.11k/802.11v/802.11r/802.11u/802.11ai/802.11ah简介

802.11w&#xff08;PFM&#xff09; Protected Management Frames,802.11w协议主要基于现有的对数据报文的加密形式&#xff0c;对管理帧进行类似的加密。802.11w需要加密的管理帧包括解关联帧、去认证帧及强壮Action帧。 802.11k&#xff08;RRM&#xff09; Radio Resource …

Transformer家族

在《Transformer原理》中我们介绍了&#xff0c;现在很多大模型都是基于Transformer&#xff0c;其中最出名就是GPT和BERT模型&#xff0c;在GPT和BERT模型被提出来之后&#xff0c;NLP领域也出现了基于Transformer结构的模型&#xff0c;按照模型结构基本可以分为三类&#xf…

ruoyi-vue插件集成websocket

链接&#xff1a;插件集成 | RuoYi WebSocketServer.java&#xff1a;补充代码 /*** 此为广播消息* param message 消息内容*/public void sendAllMessage(String message) {LOGGER.info("【websocket.sendAllMessage】广播消息:"message);try {for(String sessionI…

游戏免费下载平台模板源码

功能介绍 此游戏网站模板源码是专门为游戏下载站而设计的&#xff0c;旨在为网站开发者提供一个高效、易于维护和扩展的解决方案。 特点&#xff1a; 响应式设计&#xff1a;我们的模板可以自适应不同设备屏幕大小&#xff0c;从而为不同平台的用户提供最佳的浏览体验。 …

亲测有效,职场焦虑迷茫的测试人都需要的3大良方!

Hi&#xff0c;大家好&#xff0c;我是小马哥。日常大家聊天时经常提及一个关键词——大环境不好&#xff0c;这种感受像一股暗流&#xff0c;由此带来了很多变化。 有人在这股潮流中感到迷失&#xff0c;选择了躺平&#xff1b;而有的人则积极寻找应对方法&#xff0c;努力在…

Dgraph 入门教程四《开发环境的搭建》

在深入 了解Dgraph 之前&#xff0c;我们先了解下开发环境&#xff0c;毕竟让开发人员真正动起手来才是第一步。 Dgraph 支持很多种语言的开发&#xff0c;包括GO&#xff0c;Python&#xff0c;JS&#xff0c;C#和Java等等。出于项目需要&#xff0c;只了解下JS和Java。 1、…

如何用SSH连接

以gitlab的SSH来举例&#xff0c;包括配置与克隆的过程&#xff1a; Git 是一个分布式版本控制系统&#xff0c;这意味着您可以在本地工作&#xff0c; 然后将您的更改共享或推送到服务器。在这种情况下&#xff0c;您推送到的服务器是 GitLab。 GitLab 使用 SSH 协议与 Git …

DC-DC直流隔离模块电源正负双输出升压变换器HRA系列5V12V24V转±50v±80v±110v±150v±200v±250v±300v

特点 效率高达 80%以上1*1英寸标准封装电源正负双输出稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上 应用 HRA 0.2~8W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36V、36…

HTML视频笔记

学习arm开发板&#xff0c;涉及到网页HTML PHP什么的&#xff0c;简单看个视频学习下 HTML&#xff5c;超简单HTML入门教程 https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element ​​​​​​vscode需要的libc6等需要的版本高​​​​​​ 为了安装vscode&#xff0c;将…

Github上哪些好用的工具

专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; Qexo-爱写博客的师傅强烈推荐 漂亮的 Hexo 静态博客编辑器。该项目是基于 Django 的 Hexo 静态博客管理后台&#xff0c;支持文章管理、…

[C语言]——数组练习

目录 练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚 练习2&#xff1a;⼆分查找 练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚 编写代码&#xff0c;演⽰多个字符从两端移动&#xff0c;向中间汇聚 #include <stdio.h> int main() {char a…

基础小白十天学会linux------>linux系统的介绍,应用,以及快速上手

什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;是计算机系统的核心与基石。它负责为用户和其他软件提供交互的界面&#xff0c;同时管理系统资源&#xff0c;如CPU时间、内…

Vue3实战 第十二章 表格组件里el-table-column 的 formatter属性应用

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…