代理模式的C++实现示例

news2025/3/12 12:00:39

核心思想

代理模式(Proxy Pattern)是一种结构型设计模式,其核心思想是为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理对象通常会在客户端和目标对象之间起到中介作用,可以在不改变目标对象的情况下,增加额外的功能或控制访问。

解决的问题

代理模式主要解决以下问题:
​访问控制:限制对目标对象的访问,例如权限控制、延迟加载等。
​功能增强:在不修改目标对象的情况下,增加额外的功能,例如日志记录、性能监控等。
​远程代理:为位于不同地址空间的对象提供本地代表,例如远程方法调用(RMI)。
​虚拟代理:延迟创建开销较大的对象,直到真正需要时才创建。

使用场景

延迟加载(Lazy Loading)​:当对象的创建和初始化成本较高时,可以使用代理模式来延迟对象的创建,直到真正需要时才进行初始化。
​访问控制:当需要对对象的访问进行控制时,可以使用代理模式来限制或过滤对目标对象的访问。
​日志记录:当需要在访问对象时记录日志或进行审计时,可以使用代理模式来添加日志功能。
​远程代理:当需要访问远程对象时,可以使用代理模式来隐藏网络通信的复杂性。

优点:​

​职责清晰:代理模式将客户端与目标对象解耦,使得职责更加清晰。
​扩展性强:可以在不修改目标对象的情况下,通过代理对象增加额外的功能。
​控制访问:代理对象可以控制对目标对象的访问,例如权限控制、延迟加载等。

缺点:​

​增加复杂性:引入代理对象会增加系统的复杂性,尤其是在需要多层代理时。
​性能开销:代理对象可能会引入额外的性能开销,尤其是在远程代理或虚拟代理的情况下。

示例代码

以下是一个简单的 C++11 代理模式示例,展示了如何使用代理模式来实现延迟加载和日志记录:

#include <iostream>
#include <memory>
#include <string>

// 目标接口
class Subject {
public:
    virtual void Request() const = 0;
    virtual ~Subject() = default;
};

// 真实目标类
class RealSubject : public Subject {
public:
    void Request() const override {
        std::cout << "RealSubject: Handling Request." << std::endl;
    }
};

// 代理类
class Proxy : public Subject {
public:
    Proxy() : realSubject_(nullptr) {}

    void Request() const override {
        // 延迟加载真实对象
        if (!realSubject_) {
            realSubject_ = std::make_unique<RealSubject>();
        }
        std::cout << "Proxy: Logging before handling request." << std::endl;
        realSubject_->Request();
        std::cout << "Proxy: Logging after handling request." << std::endl;
    }

private:
    mutable std::unique_ptr<RealSubject> realSubject_;
};

// 模拟客户端代码
void ClientCode(const Subject& subject) {
    subject.Request();
}

int main() {
    std::cout << "Client: Executing the client code with a real subject:" << std::endl;
    RealSubject realSubject;
    ClientCode(realSubject);//这里客户端直接使用目标对象
	std::cout << std::endl;
    std::cout << "\nClient: Executing the client code with a proxy:" << std::endl;
    Proxy proxy;
    ClientCode(proxy);//这里客户端使用代理对象
    return 0;
}

输出结果

Client: Executing the client code with a real subject:
RealSubject: Handling Request.

Client: Executing the client code with a proxy:
Proxy: Logging before handling request.
RealSubject: Handling Request.
Proxy: Logging after handling request.

代码解析

​Subject:定义了目标接口,RealSubject 和 Proxy 都实现了这个接口。
​RealSubject:是真实的目标对象,负责实际的业务逻辑。
​Proxy:代理类,持有一个 RealSubject 的指针,并在 Request 方法中控制对 RealSubject 的访问。代理类在 Request 方法中增加了日志记录功能,并实现了延迟加载。
​ClientCode:客户端代码,通过 Subject 接口与目标对象交互,无需关心目标对象是 RealSubject 还是 Proxy。

总结

代理模式通过引入代理对象来控制对目标对象的访问,可以在不修改目标对象的情况下增加额外的功能或控制访问。它在延迟加载、访问控制、日志记录等场景中非常有用。然而,代理模式也会增加系统的复杂性和性能开销,因此在使用时需要权衡利弊。

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

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

相关文章

【阿里云】控制台使用指南:从创建ECS到系统诊断测评

前言 随着云计算技术的快速发展&#xff0c;越来越多的企业和开发者开始使用云服务来部署和管理应用程序。在众多云服务提供商中&#xff0c;阿里云&#xff08;Alibaba Cloud&#xff09;凭借其强大的基础设施和丰富的服务&#xff0c;成为了众多用户的首选。本文旨在介绍如何…

简易的微信聊天网页版【项目测试报告】

文章目录 一、项目背景二、项目简介登录功能好友列表页面好友会话页面 三、测试工具和环境四、测试计划测试用例部分人工手动测试截图web自动化测试测试用例代码框架配置内容代码文件&#xff08;Utils.py&#xff09;登录页面代码文件&#xff08;WeChatLogin.py&#xff09;好…

基于腾讯云高性能HAI-CPU的跨境电商客服助手全链路解析

跨境电商的背景以及痛点 根据Statista数据&#xff0c;2025年全球跨境电商市场规模预计达6.57万亿美元&#xff0c;年增长率保持在12.5% 。随着平台规则趋严&#xff08;如亚马逊封店潮&#xff09;&#xff0c;更多卖家选择自建独立站&#xff0c;2024年独立站占比已达35%。A…

北京迅为RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

从0到1入门Docker

一、快速入门 Docker run命令中的常见参数 -d&#xff1a;让容器后台运行--name&#xff1a;给容器命名&#xff08;唯一&#xff09;-e&#xff1a;环境变量-p&#xff1a;宿主机端口映射到容器内端口镜像名称结构&#xff1a;Repository &#xff1a;TAG&#xff08;镜像名&…

应用篇| 抓包工具-charles的使用

上文说到,我们app爬虫要借助一些抓包工具,本节课就教大家如何使用抓包工具分析app的流量。抓包工具的使用是app爬虫的必修课。相比 Fiddler 来说,Charles 的功能更强大,而且跨平台支持更好。 charles安装 官方网站:https://www.charlesproxy.com 下载链接:Download a F…

Docker搭建Redis哨兵模式【一主两从三哨兵】

Docker搭建Redis哨兵模式 系统: CentOS 7 Dockder 版本: VMware虚拟机 网络适配器 网络连接 桥接模式:直接连接物理网络查看IP命令 ip addr一、哨兵模式概述 1. 官方文档与关联博客 官方文档:https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel关联博…

labview实现大小端交换移位

在解码时遇到了大小端交换的问题&#xff0c;需要把高低字节的16进制值进行互换&#xff0c;这里一时间不知道怎么操作&#xff0c;本来打算先把16进制转字节数组&#xff0c;算出字节数组的大小&#xff0c;然后通过模2得到0&#xff0c;1&#xff0c;来判断是否为奇数位和偶数…

Three.js 进阶(灯光阴影关系和设置、平行光、阴影相机)

本篇主要学习内容 : 灯光与阴影聚光灯点光源平行光阴影相机和阴影计算投射阴影接受阴影 点赞 关注 收藏 学会了 1.灯光与阴影 1、材质要满足能够对光有反应 2、设置渲染器开启阴影计算 renderer.shadowMap.enabledtrue 3、设置光照投射阴影 directionalLight.castShadow …

RK3588部署YOLOv8(2):OpenCV和RGA实现模型前处理对比

目录 前言 1. 结果对比 1.1 时间对比 1.2 CPU和NPU占用对比 2. RGA实现YOLO前处理 2.1 实现思路 2.2 处理类的声明 2.3 处理类的实现 总结 前言 RK平台上有RGA (Raster Graphic Acceleration Unit) 加速&#xff0c;使用RGA可以减少资源占用、加速图片处理速度。因此…

打造智能钉钉机器人:借助智谱GLM-4-Flash实现高效智能回复(文末附源码)

文章目录 前言一、准备工作&#xff08;一&#xff09;钉钉机器人&#xff08;二&#xff09;智谱 GLM-4-Flash&#xff08;三&#xff09;内网穿透工具 cpolar&#xff08;四&#xff09;需要准备的工具和环境 二、钉钉机器人的创建与配置步骤1&#xff1a;创建钉钉机器人步骤…

使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图

以下是使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图&#xff1a; graph TDA[开始移植] --> B[代码兼容性检查]B --> C[检查系统调用差异\nfork/exec -> CreateProcess]B --> D[检查文件路径格式\n/ vs \\]B --> E[检查依赖库兼容性\nPOSIX vs …

入门到入土,Java学习 day16(算法1)

利用循环遍历来判断是否相等 二分查找/折半查找 前提条件&#xff1a;数组中的数据有序 每次排除一般的查找范围 用min,max,mid来处理&#xff0c;最大加最小除2&#xff0c;比较&#xff0c;然后得到在中间左边还是右边然后更新最大最小 public class Two {// 二分查找方法…

Vulnhub 靶机 VulnOSv2 write up opendocman cms 32075 sql注入 账号密码 ssh连接 37292.c 脏牛提权

Vulnhub 靶机 VulnOSv2 write up opendocman cms 32075 sql注入 账号密码 ssh连接 37292.c 脏牛提权 一、信息收集 1、首先拿到靶场先扫一下ip arp-scan -l 3、 2、指纹扫描 nmap -sS -sV 192.168.66.178nmap -p- -sV -A 192.168.66.253 PORT STATE SERVICE VERSION 22…

Unity辅助工具_头部与svn

Unity调用者按钮增加PlaySideButton using QQu; using UnityEditor; using UnityEngine; [InitializeOnLoad] public class PlaySideButton {static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLe…

DeepLabv3+改进8:在主干网络中添加SIM注意力机制|助力涨点

🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 论文简介 在本文中,我们提出了…

电路原理(电容 集成电路NE555)

电容 1.特性&#xff1a;充放电&#xff0c;隔直流&#xff0c;通交流 2.电容是通过聚集正负电荷来存储电能的 3.电容充放电过程可等效为导通回路 4.多电容并联可以把容量叠加&#xff0c;但是多电容串联就不会&#xff0c;只会叠加电容的耐压值。 6.电容充放电时相当于通路&a…

函数式编程的核心

函数式编程 函数式编程&#xff08;funcitonal programming&#xff09;其实是个很古老的概念。 高阶函数和内存分析 函数式一阶公民 函数式编程最鲜明的特点就是&#xff1a;函数式一等公民&#xff0c;指的是函数与其他数据类型一样&#xff0c;处于平等地位&#xff0c;可…

【易康eCognition实验教程】006:在影像上添加文本

在某些情况下&#xff0c;希望能在影像上面显示文本文字&#xff0c;例如&#xff0c;一个地图的名称或者是多时相影像分析的年或月的显示。此外&#xff0c;文本如果作为一个规则集导出的部分则可以被纳入数字影像中。如下图所示&#xff1a; 若要添加文本&#xff0c;在影像视…

C++【类和对象】(超详细!!!)

C【类和对象】 1.运算符重载2.赋值运算符重载3.日期类的实现 1.运算符重载 (1).C规定类类型运算符使用时&#xff0c;必须转换成调用运算符重载。 (2).运算符重载是具有特殊名字的函数&#xff0c;名字等于operator加需要使用的运算符&#xff0c;具有返回类型和参数列表及函数…