篇十二:代理模式:控制对象访问
篇十二:“代理模式:控制对象访问”
开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。
另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d
设计模式是软件开发中的重要知识,代理模式(Proxy Pattern)是结构型设计模式之一。代理模式旨在通过代理对象来控制对另一个对象的访问。本文将分析代理模式的核心思想和实际应用,并指导读者在C++中如何应用代理模式来控制对象访问。
1. 代理模式的核心思想:
代理模式是一种结构型设计模式,其核心思想是为其他对象提供一个代理对象,通过代理对象来控制对原始对象的访问。代理对象与原始对象具有相同的接口,使得客户端可以无需关心真正的对象,而是通过代理对象来进行访问。代理模式中涉及三个角色:
- 抽象主题(Subject): 定义了代理对象和真正对象的共同接口。
- 真正主题(Real Subject): 实现了抽象主题的接口,是真正需要被访问的对象。
- 代理(Proxy): 包含一个指向真正主题的指针,并实现了抽象主题的接口。代理对象控制着对真正主题的访问,并可以在访问前后添加额外的逻辑。
代理模式通过引入代理对象,对访问对象进行了控制和管理,使得客户端和真正对象之间实现了解耦,从而增加了系统的灵活性和可维护性。
2. 代理模式的实际应用:
代理模式在现实生活和软件开发中都有广泛的应用,以下是一些实际应用场景:
- 远程代理: 用于在不同地址空间中代表对象,可以实现分布式系统的远程访问。在远程代理中,代理对象负责将请求传递给真正的主题对象,并将结果返回给客户端,隐藏了真正主题的具体实现细节。
- 虚拟代理: 用于延迟创建对象,当对象非常消耗资源时,可以在需要时再进行创建。在虚拟代理中,代理对象负责在真正主题对象被访问前进行懒加载,从而节省了系统资源。
- 安全代理: 用于控制对对象的访问权限,可以限制某些用户对对象的访问。在安全代理中,代理对象可以根据用户的身份或权限来决定是否允许访问真正主题对象。
- 智能代理: 用于在访问对象前后添加额外的逻辑,如添加缓存、日志记录等。在智能代理中,代理对象可以在访问真正主题对象前执行预处理逻辑,如缓存数据,或在访问后执行后处理逻辑,如记录日志。
3. 在C++中使用代理模式:
a. 定义抽象主题类:
// Subject.h
class Subject {
public:virtual void request() const = 0;
};
b. 定义真正主题类:
// RealSubject.h
#include <iostream>class RealSubject : public Subject {
public:void request() const override {std::cout << "RealSubject handles the request." << std::endl;}
};
c. 定义代理类:
// Proxy.h
#include "Subject.h"
#include "RealSubject.h"class Proxy : public Subject {
public:void request() const override {if (!realSubject_) {realSubject_ = new RealSubject();}preRequest();realSubject_->request();postRequest();}private:RealSubject* realSubject_ = nullptr;void preRequest() const {std::cout << "Proxy handles pre-request tasks." << std::endl;}void postRequest() const {std::cout << "Proxy handles post-request tasks." << std::endl;}
};
d. 使用代理模式:
// main.cpp
#include "Subject.h"
#include "Proxy.h"int main() {Subject* proxy = new Proxy();proxy->request();delete proxy;return 0;
}
在上述示例中,我们首先定义了抽象主题类Subject
,其中包含了操作的抽象接口request()
。然后,我们创建了真正主题类RealSubject
,实现了request()
接口,表示真正需要被访问的对象。接着,我们创建了代理类Proxy
,包含了指向真正主题的指针,并实现了request()
接口。在代理类中,我们通过代理对象来控制对真正主题的访问,并在访问前后添加额外的逻辑。
4. 代理模式的代码解析:
代理模式通过引入代理对象,控制和管理对访问对象的访问。在代理模式中,真正主题和代理对象实现了相同的接口,使得客户端可以无差别地使用代理对象或真正主题。代理对象通过在访问前后添加额外的逻辑,实现了对真正主题的控制和管理。
5. 注意事项:
在使用代理模式时,需要注意以下几点:
- 确定代理类型:根据不同的应用场景,可以选择适合的代理类型,如远程代理、虚拟代理、安全代理或智能代理。
- 控制粒度:代理模式中的粒度是很重要的,过细的粒度可能会引起性能问题,过粗的粒度可能会导
致代理对象过于臃肿。需要根据实际需求来选择合适的粒度。
6. 总结:
代理模式是一种重要的设计模式,通过引入代理对象,控制和管理对访问对象的访问。在C++中,我们可以通过定义抽象主题类、真正主题类和代理类来应用代理模式。代理模式在现实生活和软件开发中都有广泛的应用,可以实现远程访问、懒加载、访问控制和额外逻辑处理等功能。
希望本文能够帮助您深入理解代理模式的核心思想和实际应用,并通过C++的示例代码演示了如何实现代理模式。设计模式是软件开发中的重要知识,掌握不同的设计模式有助于提高代码质量、可维护性和可扩展性。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您深入学习和应用设计模式。
参考文献:
- Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
- C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/
相关文章:
篇十二:代理模式:控制对象访问
篇十二:“代理模式:控制对象访问” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料,…...
P1657 选书
1:思路:一看数据,嗯....!,爆搜嘛?,看一眼题目,嗯!!!,爆搜! 配上俺的无敌小剪枝,按下拿下! 2:暴力枚举每个人获…...
代码随想录第46天 | 139. 单词拆分、多重背包
139. 单词拆分 确定dp数组以及下标的含义 dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。 确定递推公式 如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是tru…...

Unreal View Model结合GAS使用
这个东西真的难用,各种问题,记录下 官方文档 bilibili教学 开启插件 插件开启 Viewmodel: build.cs内PublicDependencyModuleNames加上ModelViewViewModel 创建ViewModel类 #pragma once#include "CoreMinimal.h" #include &quo…...

Spring-Cloud-Loadblancer详细分析_2
LoadBalancerClients 终于分析到了此注解的作用,它是实现不同服务之间的配置隔离的关键 Configuration(proxyBeanMethods false) Retention(RetentionPolicy.RUNTIME) Target({ ElementType.TYPE }) Documented Import(LoadBalancerClientConfigurationRegistrar…...

uniapp 左右滑动切换页面并切换tab
实现效果如图 要实现底部内部的左右滑动切换带动上方tab栏的切换,并且下方内容要实现纵向滚动 ,所以需要swiper,swiper-item,scroll-view组合使用 tab栏部分 <view class"tabs"><view class"tab_item" v-for&…...

FinClip 支持小程序维度域名配置;桌面端体验活动进行中
FinClip 的使命是使您(业务专家和开发人员)能够通过小程序解决关键业务流程挑战,并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点,看看是否有助于您实现目标。 产品方面的相关动向👇…...

已有公司将ChatGPT集成到客服中心以增强用户体验
Ozonetel正在利用ChatGPT来改善客户体验。该公司表示,他们通过使用ChatGPT收集与客户互动过程收集的“语料”能够更有针对性地提高服务效率,提供个性化的用户体验,并实现更高的客户满意度。[1] 通过这套解决方案,客服中心将拥有一…...

108. 将有序数组转换为二叉搜索树
文章目录 题目描述思路解答(c)结果 题目描述 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二…...
视频分辨率: UXGA/SVGA/VGA/QVGA/QQVGA
视频分辨率除了常见的720p/2K/4K外, 还有VGA系列的分辨率 相关字段含义: V——Video (视频) G——Graphics(图像) A——Array(阵列) S——Super(超级) X——Extended(扩展) U——Ultra(终极) W——Wide&am…...
Leecode力扣27数组移除元素
题目链接:力扣 最终可运行的代码1:暴力法 class Solution { public:int removeElement(vector<int>& nums, int val) {int index0;int numnums.size();while(index<nums.size()-1){if(nums[index]val){int jindex;num--;while(j<nums.…...

百度云盘发展历程与影响
摘要: 百度云盘作为中国领先的云存储与共享服务提供商,自其创立至今经历了多个阶段的发展与变革。本论文通过对百度云盘的历史回顾与分析,探讨了其在技术、商业模式、用户体验以及对社会的影响等方面的演变。同时,还分析了在竞争激…...

SpringBoot复习:(33)WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter
WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口,重写了一些方法,也就是默认对Spring Mvc进行了一些配置: 该静态类上有个**Import**注解: Import(EnableWebMvcConfiguration.class) 它的父类…...

f1tenth仿真2
起点(0.192,0.201) 终点(9.902,5.148) 起点(9.902,5.148) 终点(-13.289,7.058) 起点(-13.289,7.058) 终点(-13.289,0.201) 起点(-13.289,0.201) #! /usr/bin/env python import time from numba import jit import math import rospy import numpy as…...

exec族函数
本节学习exec族函数,并大量参考了以下链接: linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)_云英的博客-CSDN博客 exec族函数函数的作用 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程…...

dbm与mw转换
功率值10^(dBm值/10),单位mW。 对于-5dBm,其功率值为0.3162 mW。 dBm 10 * lg(mW)...
【Linux】多线程之单例模式
多线程之单例模式 什么是设计模式,都有哪些设计模式单例模式饿汉模式懒汉模式 什么是设计模式,都有哪些设计模式 设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理…...

Vision Transformer模型入门
Vision Transformer模型入门 一、Vision Transformer 模型1,Embedding 层结构详解2,Transformer Encoder 详解3,MLP Head 详解 二、ViT-B/16 网络结构三、Hybrid 模型详解四、ViT 模型搭建参数 一、Vision Transformer 模型 总体三个模块&am…...
如何使用 Go 获取 URL 的参数,以及使用时的问题
Go 获取 URL 参数也很容易,但是由于 Go 有严格的数据类型和错误管理,所以在使用时会些微有些复杂。所以本文不仅会讲如何获取 URL 的参数,也会讲在使用时的一些问题。 首先假设 URL 是https://www.example.com/?keywordabc&id12。 其他…...
Linux驱动-基于QT控制LED灯
Linux驱动-基于QT控制LED灯 环境搭建LED驱动程序基于总线设备模型基于设备树 QT界面编程测试 环境搭建 平台 韦东山100ask imax6ull pro && 大象嵌入式开发板Build Root 使用Build root编译image,具体配置可参考《嵌入式Linux应用开发完全手册-IMX6ULL开发…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...