代理模式-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…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
