当前位置: 首页 > news >正文

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

核心思想

代理模式(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。

总结

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

相关文章:

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

核心思想 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心思想是为其他对象提供一个代理或占位符&#xff0c;以控制对这个对象的访问。代理对象通常会在客户端和目标对象之间起到中介作用&#xff0c;可以在不改变目标对象的情况下&am…...

【每日学点HarmonyOS Next知识】防止重复点击、对话框收拾拦截、自定义键盘焦点、页面层级、自定义对话框创建

1、HarmonyOS onClick点击事件&#xff0c;如何实现重复点击同一个按钮或toggle&#xff0c;两次间隔时间过短则失效&#xff0c;来防止重复点击&#xff1f; onClick点击事件&#xff0c;如何实现重复点击同一个按钮或toggle&#xff0c;两次间隔时间过短则失效&#xff0c;来…...

显示篇(2)- DRM A733 多显主副显绑定

通过hal层根据优先级绑定&#xff0c;优先级越高送显越靠前。&#xff08;sdk默认mipi优先级最高为主显&#xff09; 1.双显 如edp主mipi副&#xff0c;edp优先级搞。 更改如下 diff --git a/hwc-hal/drm/drmConnector.cpp b/hwc-hal/drm/drmConnector.cpp --- a/hwc-hal/d…...

mysql的Innodb最大支持的索引长度是多少,以及索引长度怎么计算

今天正好有空&#xff0c;来讲个之前粉丝经常问的一个知识&#xff0c;就是mysql的Innodb最大支持的索引长度是多少&#xff1f;以及索引长度怎么计算&#xff1f; 一、mysql的innodb引擎&#xff0c;创建索引最大支持的长度是多少字节&#xff1f; 不墨迹&#xff0c;直接说…...

Android Compose: `remember` 与 `ViewModel` 保存数据的优缺点对比

在开发 Android 应用时&#xff0c;管理 UI 状态是一个不可避免的话题。Jetpack Compose 提供了两种常见的方式来保存和管理数据&#xff1a;remember 和 ViewModel。它们各有优缺点&#xff0c;适用于不同的场景。 本文将详细对比这两者在保存数据时的优缺点&#xff0c;帮助…...

vue3+vite模式下修改pinia的stroe初始值不进行热HMR更新解析

原因&#xff1a; import { defineStore } from pinia interface CounterState {count: number;name: string; } export const useCounterStore defineStore(counter, {state: () > ({ count: 10, name: Eduardo }),getters: {doubleCount: (state:CounterState) > st…...

【一句话经验】ubuntu vi/vim 模式自动设置为paste

从centos过来&#xff0c;发现ubutun有些地方不习惯&#xff0c;尤其是vi的粘贴&#xff0c;默认自动进去了代码模式&#xff0c;导致每次粘贴必须得set paste&#xff0c;否则会出现问题。 解决办法非常简单&#xff0c;按照下面命令执行即可&#xff1a; cd ~ echo "…...

[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传

文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点&#xff1a; 面向连接&#xff0c;可靠性高&#xff0c;全双工&#xff0c;面向字节流udp特点&#xff1a;无连接&#xff0c;不…...

训练大模型LLM选择哪种开发语言最好

训练大型语言模型&#xff08;LLM&#xff09;时&#xff0c;选择合适的编程语言主要取决于效率、生态支持、开发便利性以及特定需求&#xff08;如性能优化或硬件适配&#xff09;。以下是常见语言的分析和推荐&#xff1a; --- 1. Python&#xff08;首选语言&#xff09; 优…...

Jupyter Notebook 全平台安装与配置教程(附Python/Anaconda双方案)

一、软件定位与特性 Jupyter Notebook 是交互式编程与数据科学分析工具&#xff0c;支持 40 编程语言&#xff0c;其基于浏览器的「代码块可视化」工作流&#xff0c;已成为机器学习、数据清洗、学术研究的标准环境。核心优势包括&#xff1a; 实时执行代码片段并保存结果支持…...

AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录

AutoDL平台租借GPU&#xff0c;创建transformers环境&#xff0c;使用VSCode SSH登录 一、AutoDl平台租用GPU 1.注册并登录AutoDl官网&#xff1a;https://www.autodl.com/home 2.选择算力市场&#xff0c;找到需要的GPU&#xff1a; 我这里选择3090显卡 3.这里我们就选择P…...

【Java篇】行云流水,似风分岔:编程结构中的自然法则

文章目录 Java 程序逻辑控制&#xff1a;顺序、分支与循环结构全面解析一、顺序结构二、分支结构2.1 if 语句2.1.1 基本语法2.1.2 if-else 语句2.1.3 if-else if-else 语句 2.2 switch 语句 三、循环结构3.1 while 循环3.2 break 语句3.3 continue 语句3.4 for 循环 四、输入输…...

2.4 基于Vitest的单元测试基础设施搭建

文章目录 1. 现代单元测试体系解析测试金字塔演进Vitest核心定位2. 基础设施架构设计整体架构图3. 环境配置全流程3.1 基础环境搭建3.2 配置文件`vitest.config.ts`3.3 测试环境初始化4. 测试用例编写规范4.1 基础测试示例4.2 Vue组件测试4.3 异步逻辑测试5. Mock策略深度优化5…...

SqlSugar 进阶之原生Sql操作与存储过程写法 【ORM框架】

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录一、前言 &#x1f343;二、用法介绍三、方法列表四、使用案例五、调用存储过程六、in参数用法七、SqlServer带Go的脚…...

Navicat Premium(数据库管理工具) v17.1.13 中文 Windows

介绍 Navicat Premium 是一款多功能的数据库管理工具&#xff0c;可以连接并管理主流的数据库系统&#xff0c;如MySQL、PostgreSQL、Oracle、SQL Server等。它提供了丰富的功能和强大的工具&#xff0c;可以帮助用户轻松地管理数据库&#xff0c;进行数据导入导出、查询、备份…...

IDEA(十一)调整新版本的工具栏显示Git操作(pull、commit、push、revert等)

目录 一、背景二、操作步骤2.1 开启新 UI 样式2.2 设置 Tool Window 工具栏 一、背景 好久没有更新 IDEA 了&#xff0c;更新之后发现 IDEA 的工具栏消失了。一番操作之后&#xff0c;终于把 IDEA 的工具栏的设置调整好了&#xff0c;在此进行记录调整步骤&#xff0c;供大家学…...

QoS质量配置

他们祝你挺拔&#xff0c;再挺拔一点&#xff1b;我只祝你&#xff0c;永远年少&#xff0c;永远一骑当先. 1. QoS的概念 QoS(服务质量)是指一个网络能够利用各种各样的基础技术向选定的网络通信提供更好 的服务的能力。这些基础技术包括&#xff1a;帧中继&#xff08;FrameR…...

2024年群智能SCI1区TOP:混沌可行性恢复粒子群算法CEPSO,深度解析+性能实测

目录 1.摘要2.改进策略3.结果展示4.参考文献5.代码获取 1.摘要 本文研究了解决二阶段非线性固定费用运输问题&#xff08;Two-stage NFCTP&#xff09;&#xff0c;该问题的特点是每条运输弧线都与固定费用和与运输量的平方成正比的变量费用相关联。由于涉及固定费用和非线性组…...

ORACLE EBS数据库RELINK方式搭建克隆环境

ORACLE EBS系统的数据库&#xff0c;一般都安装了很多特定功能的小补丁来解决特定的BUG&#xff1b;因此对于已经安装好的系统&#xff0c;想要克隆一套测试环境、搭建一个新的备机做测试等&#xff0c;如果按照生产环境标准&#xff0c;则需要安装大量补丁&#xff0c;带来很大…...

第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)

客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...