代理模式-C++实现
代理模式是一种结构型设计模式,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者无法引用另一个对象,这个时候就需要一个代理对象充当客户端和目标对象之间的中介。
代理模式就是代理对象具备目标对象的所有功能,并代替真实对象完成相应操作,在操作前或操作后进行功能增强的工作。这也是代理对象和目标对象之间的区别。
举例:
以租房为例,租客想要租房,需要经过房屋中介审核租客资料,审核通过之后才可以通知房东进行租房。
// 抽象房东类
class Landlord
{
public:virtual ~Landlord() {}virtual void Rent() = 0;
};// 具体房东类
class RealLandlord: public Landlord
{
public:virtual void Rent() override{std::cout << "房东出租房屋" << std::endl;}
};// 中介代理
class EstateAgent: public Landlord
{
public:EstateAgent(){}virtual void Rent() override{if (CheckTenant()){std::cout << "中介已代理,接受租客请求" << std::endl;if (!landLord_)landLord_ = std::make_shared<RealLandlord>();landLord_->Rent();std::cout << "中介代理,签订租约" << std::endl;}elsestd::cout << "抱歉,您的资质审核未通过" << std::endl;}private:bool CheckTenant(){// 检查租客资质// ....return true; // 假设检查成功}private:std::shared_ptr<Landlord> landLord_;
};
测试:
void TestProxy()
{std::shared_ptr<Landlord> agent = std::make_shared<EstateAgent>();agent->Rent();
}
我们创建一个抽象房东类Landlord,定义了一个出租房屋的方法,一个真实目标对象去实现这个方法。还创建了一个中介代理类EstateAgent代替真实目标对象完成功能。
在中介代理类中,我们可以在出租房屋前后进行一些增强操作,比如检查租客资质等。
客户端方面,我们只需要创建一个代理对象,它会代替真实对象完成功能,客户端就不需要关心真实对象的创建逻辑。
代理模式遵循的设计原则:
1、单一职责原则:代理模式在客户端和实际对象之间额外增加了一个代理对象,使得代理对象具有更多的责任,而实际对象只需要专注自己的职责即可。
2、开放封闭原则:由于代理模式增加了代理类这一角色,所以可以在不修改现有代码的情况下添加新的代理类达到添加新功能的需求。比如上述例子我们可以添加一个新的代理类,这个代理类的职责是只检查房东资质。该模式使得对实际对象的访问和控制可以在代理层进行变化和扩展。
3、依赖倒置原则:代理模式通过引入抽象的代理接口,将客户端从实际对象解耦,客户端只需要面向代理接口编程,不需要直接依赖实际对象的具体实现。
优点:
1、隐藏对象复杂性:代理对象封装了实际对象的复杂性,使得客户端对实际对象的操作变得简单
2、提供额外的功能:代理对象可以在实际对象的基础上添加额外的功能,比如日志记录、权限验证、缓存等。
3、提供性能:代理模式允许延迟加载对象(在使用的时候才加载对象),从而避免了资源消耗和提高性能。
4、保护实际对象:代理对象将实际对象的功能封装起来,客户端就不能对实际对象直接访问
5、提供远程访问能力:通过代理模式,客户端可以访问远程对象,比如从而实现分布式系统或系统调用。
缺点:
1、会增加代码复杂性:代理模式增加了代理类作为客户端和实际对象之间的中间层。
2、可能引起性能损失:在某些情况下,代理模式可能会引入额外的开销,导致性能略有下降。
为什么会引起性能损失:
1、远程代理:当使用远程代理时,由于需要通过网络传输数据,可能会引起性能下降。因此,应该尽量减少网络通信量,使用缓存或其他优化技术。
2、虚拟代理:当使用虚拟代理时,由于需要创建和初始化代理对象,可能会引起一定的性能下降。因此,应该尽量减少代理对象创建的时间和开销。
3、安全代理:当使用安全代理时,由于需要进行权限验证和访问控制,可能会引起一定的性能下降。因此,应该尽量采用高效的算法和数据结构,减少耗时的操作。
4、智能引用代理:当使用智能引用代理时,由于需要记录对象的使用情况和状态,可能会引起一定的性能下降。因此,应该尽量减少对代理对象的状态记录和操作。
5、延迟加载代理:当使用延迟加载代理时,由于需要推迟实际对象的创建或加载,可能会引起一定的性能下降。因此,应该尽量减少延迟加载的时间和开销,避免对用户体验造成影响。
相关文章:
代理模式-C++实现
代理模式是一种结构型设计模式,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者无法引用另一个对象,这个时候就需要一个代理对象充当客户端和目标对象之间的中介。 代理模式就是代理对象具备目标对象的所有…...
从 0 到 1 开发一个 node 命令行工具
G2 5.0 推出了服务端渲染的能力,为了让开发者更快捷得使用这部分能力,最写了一个 node 命令行工具 g2-ssr-node:用于把 G2 的 spec 转换成 png、jpeg 或者 pdf 等。基本的使用如下: $ g2-ssr-node g2png -i ./bar.json -o ./bar.…...
VsCode中使用功能vite创建vue3+js项目报错
VsCode中使用功能vite创建vue3js项目报错 VsCode中使用功能vite创建vue3js项目import模块报错如下处理方法 VsCode中使用功能vite创建vue3js项目import模块报错如下 处理方法 在项目根目录新建jsconfig.json {"compilerOptions": {"baseUrl": "./&q…...
COGVLM论文解读(COGVLM:VISUAL EXPERT FOR LARGE LANGUAGE MODELS)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、摘要二、引言三、模型方法1、模型思路2、融合公式 四、训练方法总结 前言 2023年5月18日清华&智谱AI发布并开源VisualGLM-6B以来,清华KEG&…...
Flink-时间流与水印
时间流与水印 一、背景二、时间语义1.事件时间(event time)2.读取时间(ingestion time)3.处理时间(processing time) 三、水印-Watermarks1.延迟和正确性2.延迟事件3.顺序流4.无序流5.并行流 四、Windows1.…...
BiLSTM-CRF的中文命名实体识别
项目地址:NLP-Application-and-Practice/11_BiLSTM-ner-bilstm-crf/11.3-BiLSTM-CRF的中文命名实体识别/ner_bilstm_crf at master zz-zik/NLP-Application-and-Practice (github.com) 读取renmindata.pkl文件 read_file_pkl.py # encoding:utf-8import pickle# …...
paddle detection 训练参数
#####################################基础配置##################################### # 检测算法使用YOLOv3,backbone使用MobileNet_v1,数据集使用roadsign_voc的配置文件模板,本配置文件默认使用单卡,单卡的batch_size=1 # 检测模型的名称 architecture: YOLOv3 # 根据…...
用bat制作图片马——一句话木马
效果图 代码 ECHO OFF TITLE PtoR MODE con COLS55 LINES25 color 0A:main cls echo.当前时间:%date% %time% echo.欢迎使用图片马制作工具 echo.请确保图片和php在同一路径下 echo.echo 请将图像文件拖放到此窗口并按 Enter: set /p "imagefile&q…...
json_encode() 返回 false
当 json_encode() 返回 false 时,表示 JSON 编码过程失败。这通常是因为要编码的数据包含了无效的 UTF-8 字符,而默认情况下 json_encode() 会对无效的 UTF-8 字符进行严格的处理 通过添加 JSON_INVALID_UTF8_IGNORE 选项,你告诉 json_encod…...
Android-Jetpack--Hilt详解
善学者尽其理,善行者究其难 一,定义 Hilt是针对dagger2的二次封装依赖注入框架,至于什么是依赖注入,在Android开源框架--Dagger2详解-CSDN博客 中已经讲解,建议大家先去了解Dagger2之后,再来看Hilt。这样就…...
Docker 下载加速
文章目录 方式1:使用 网易数帆容器镜像仓库进行下载。方式2:配置阿里云加速。方式3:方式4:结尾注意 Docker下载加速的原理是,在拉取镜像时使用一个国内的镜像站点,该站点已经缓存了各个版本的官方 Docker 镜…...
1091 Acute Stroke (三维搜索)
题目可能看起来很难的样子,但是看懂了其实挺简单的。(众所周知,pat考察英文水平) 题目意思大概是:给你一个L*M*N的01长方体,求全为1的连通块的总体积大小。(连通块体积大于T才计算在内…...
java elasticsearch 桶聚合(bucket)
Elasticsearch指标聚合,就是类似SQL的统计函数,指标聚合可以单独使用,也可以跟桶聚合一起使用,下面介绍Java Elasticsearch指标聚合的写法。 实例: // 首先创建RestClient,后续章节通过RestClient对象进行…...
【人生苦短,我学 Python】(4)Python 常用内置数据类型 II —— 序列数据类型(str、tuple、list、bytes和bytearray)
目录 简述 / 前言1. str 数据类型(字符串)1.1 str对象1.2 str对象属性和方法1.3 字符串编码1.4 转义字符1.5 字符串的格式化 2. tuple 数据类型(元组)2.1 创建元组对象 3. list 数据类型(列表)3.1 创建列表…...
Android 9.0 系统默认显示电量百分比
Android 9.0 系统默认显示电量百分比 近来收到项目需求需要设备默认显示电量百分比,具体修改参照如下: /frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java private void updateShowPercent() {final boolean showin…...
原神:夏洛蒂是否值得培养?全队瞬抬治疗量不输五星,但缺点也很明显
作为四星冰系治疗角色,夏洛蒂的实战表现可以说相当让人惊喜。不仅有相当有意思的普攻动作以及技能特效,而且她还有治疗和挂冰等功能性。下面就来详细聊聊夏洛蒂是否值得培养。 【治疗量让人惊喜,但也有缺点】 说实话,在使用夏洛蒂…...
Sublime text 添加到鼠标右键菜单,脚本实现
Sublime text 添加到鼠标右键菜单 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\SublimeText] "Open with Sublime Text" "Icon""D:\\Program Files\\Sublime Text\\sublime_text.exe,0" [HKEY_CLASSES_ROOT\*\shell\Subl…...
【算法】离散化 与 哈希 之间的区别
离散化(Discretization)和哈希(Hashing)是两种不同的数据处理技术,用于处理不同类型的问题。 1. 离散化(Discretization): 离散化是将一组连续的数据映射到有限个离散值的过程。主要…...
Android : GPS定位 获取当前位置—简单应用
示例图: MainActivity.java package com.example.mygpsapp;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;import android.Manif…...
目标检测——R-CNN算法解读
论文:Rich feature hierarchies for accurate object detection and semantic segmentation 作者:Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik 链接:https://arxiv.org/abs/1311.2524 代码:http://www.cs.berke…...
别再只用递归了!用C语言栈实现非递归快速排序,内存效率提升实战
从递归到迭代:C语言栈实现非递归快速排序的工程实践 在嵌入式开发和大规模数据处理场景中,递归实现的快速排序常常面临栈溢出风险。当排序10万个元素的数组时,递归深度可能达到log₂100000≈17层,在仅有2KB栈空间的STM32F103上极易…...
基于Cynthion逆向USB协议,为DP100电源开发Linux控制软件
1. 项目概述:用Cynthion嗅探USB,为DP100电源打造Linux软件作为一名长期在Linux环境下折腾硬件和嵌入式开发的爱好者,我经常遇到一个头疼的问题:很多不错的桌面小设备,比如电源、示波器、逻辑分析仪,它们的官…...
NPU跑LLM实战指南:KV Cache动态性如何突破硬件限制
NPU跑LLM实战指南:KV Cache动态性如何突破硬件限制 副标题: 从预分配+Attention Mask到三层软件栈,完整解析NPU推理架构 痛点:为什么NPU跑LLM这么难? LLM的生成机制和NPU的硬件特性存在根本冲突: LLM特性 NPU特性 冲突点 逐token生成 固定shape执行 KV Cache动态增长 动…...
OpenCore Legacy Patcher完整指南:让老旧Mac焕发新生,运行最新macOS
OpenCore Legacy Patcher完整指南:让老旧Mac焕发新生,运行最新macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹…...
茉莉花插件:如何让中文文献管理效率提升300%
茉莉花插件:如何让中文文献管理效率提升300% 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为中文文献的元数据抓…...
H.Test.DefaultApplicationBase-默认应用组合
H.Test.DefaultApplicationBase 示例项目学习教程 一、概述 H.Test.DefaultApplicationBase 展示了如何使用 WPF-Control 框架的默认应用组合(Default ApplicationBase)。这是一个"开箱即用"的应用模板,一键注册所有常用服务和模块…...
UE4SS:解锁虚幻引擎游戏的无限可能性,让每个玩家都能成为创造者
UE4SS:解锁虚幻引擎游戏的无限可能性,让每个玩家都能成为创造者 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_m…...
代码跑偏白盒补漏:判定节点覆盖全路径测试
位于程序逻辑分叉处,起着关键开通作用的判定节点,意义无比重大。于程序运行进程里,每一条if语句、else语句以及switch语句背后,事实上都暗藏着一条独具特色且彼此独立的执行回路。而测试覆盖的核心使命,就是要把这些回…...
HS2-HF Patch:3分钟解锁Honey Select 2完整游戏体验的技术指南
HS2-HF Patch:3分钟解锁Honey Select 2完整游戏体验的技术指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是专为Honey Select 2 L…...
2026苹果芯片级数据恢复:揭秘唯一原厂技术真相
在数字生活高度依赖移动设备的今天,数据安全已成为每位用户的核心关切。尤其是苹果生态用户,当遭遇设备无法开机、系统崩溃或物理损坏时,“苹果芯片级数据恢复”便成为最后的一线希望。然而,市面上众多宣称“原厂技术”的服务商&a…...
