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

篇十二:代理模式:控制对象访问

篇十二:“代理模式:控制对象访问”

开始本篇文章之前先推荐一个好用的学习工具,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/

相关文章:

篇十二:代理模式:控制对象访问

篇十二&#xff1a;“代理模式&#xff1a;控制对象访问” 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&#xff0c…...

P1657 选书

1&#xff1a;思路&#xff1a;一看数据&#xff0c;嗯....!,爆搜嘛&#xff1f;&#xff0c;看一眼题目&#xff0c;嗯&#xff01;&#xff01;&#xff01;&#xff0c;爆搜&#xff01; 配上俺的无敌小剪枝&#xff0c;按下拿下&#xff01; 2&#xff1a;暴力枚举每个人获…...

代码随想录第46天 | 139. 单词拆分、多重背包

139. 单词拆分 确定dp数组以及下标的含义 dp[i] : 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可以拆分为一个或多个在字典中出现的单词。 确定递推公式 如果确定dp[j] 是true&#xff0c;且 [j, i] 这个区间的子串出现在字典里&#xff0c;那么dp[i]一定是tru…...

Unreal View Model结合GAS使用

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

Spring-Cloud-Loadblancer详细分析_2

LoadBalancerClients 终于分析到了此注解的作用&#xff0c;它是实现不同服务之间的配置隔离的关键 Configuration(proxyBeanMethods false) Retention(RetentionPolicy.RUNTIME) Target({ ElementType.TYPE }) Documented Import(LoadBalancerClientConfigurationRegistrar…...

uniapp 左右滑动切换页面并切换tab

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

FinClip 支持小程序维度域名配置;桌面端体验活动进行中

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…...

已有公司将ChatGPT集成到客服中心以增强用户体验

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

108. 将有序数组转换为二叉搜索树

文章目录 题目描述思路解答&#xff08;c&#xff09;结果 题目描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二…...

视频分辨率: UXGA/SVGA/VGA/QVGA/QQVGA

视频分辨率除了常见的720p/2K/4K外, 还有VGA系列的分辨率 相关字段含义: V——Video &#xff08;视频&#xff09; G——Graphics&#xff08;图像&#xff09; A——Array&#xff08;阵列&#xff09; S——Super(超级) X——Extended(扩展) U——Ultra(终极) W——Wide&am…...

Leecode力扣27数组移除元素

题目链接&#xff1a;力扣 最终可运行的代码1&#xff1a;暴力法 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.…...

百度云盘发展历程与影响

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

SpringBoot复习:(33)WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter

WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口&#xff0c;重写了一些方法&#xff0c;也就是默认对Spring Mvc进行了一些配置: 该静态类上有个**Import**注解&#xff1a; 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族函数&#xff0c;并大量参考了以下链接&#xff1a; linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)_云英的博客-CSDN博客 exec族函数函数的作用 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程…...

dbm与mw转换

功率值10^(dBm值/10)&#xff0c;单位mW。 对于-5dBm&#xff0c;其功率值为0.3162 mW。 dBm 10 * lg(mW&#xff09;...

【Linux】多线程之单例模式

多线程之单例模式 什么是设计模式&#xff0c;都有哪些设计模式单例模式饿汉模式懒汉模式 什么是设计模式&#xff0c;都有哪些设计模式 设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理…...

Vision Transformer模型入门

Vision Transformer模型入门 一、Vision Transformer 模型1&#xff0c;Embedding 层结构详解2&#xff0c;Transformer Encoder 详解3&#xff0c;MLP Head 详解 二、ViT-B/16 网络结构三、Hybrid 模型详解四、ViT 模型搭建参数 一、Vision Transformer 模型 总体三个模块&am…...

如何使用 Go 获取 URL 的参数,以及使用时的问题

Go 获取 URL 参数也很容易&#xff0c;但是由于 Go 有严格的数据类型和错误管理&#xff0c;所以在使用时会些微有些复杂。所以本文不仅会讲如何获取 URL 的参数&#xff0c;也会讲在使用时的一些问题。 首先假设 URL 是https://www.example.com/?keywordabc&id12。 其他…...

Linux驱动-基于QT控制LED灯

Linux驱动-基于QT控制LED灯 环境搭建LED驱动程序基于总线设备模型基于设备树 QT界面编程测试 环境搭建 平台 韦东山100ask imax6ull pro && 大象嵌入式开发板Build Root 使用Build root编译image&#xff0c;具体配置可参考《嵌入式Linux应用开发完全手册-IMX6ULL开发…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...