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

C++设计模式|结构型 代理模式

1.什么是代理模式?

代理模式Proxy Pattern是一种结构型设计模式,用于控制对其他对象的访问。

在代理模式中,允许一个对象(代理)充当另一个对象(真实对象)的接口,以控制对这个对象的访问通常用于在访问某个对象时引入一些间接层(中介的作用),这样可以在访问对象时添加额外的控制逻辑,比如限制访问权限,延迟加载。

比如说有一个文件加载的场景,为了避免直接访问“文件”对象,我们可以新增一个代理对象,代理对象中有一个对“文件对象”的引用,在代理对象的 load 方法中,可以在访问真实的文件对象之前进行一些操作,比如权限检查,然后调用真实文件对象的 load 方法,最后在访问真实对象后进行其他操作,比如记录访问日志。

2.代理模式的组成

  • Subject(抽象主题): 抽象类,通过接口或抽象类声明真实主题和代理对象实现的业务方法。

  • RealSubject(真实主题):定义了Proxy所代表的真实对象,是客户端最终要访问的对象。

  • Proxy(代理):包含一个引用,该引用可以是RealSubject的实例,控制对RealSubject的访问,并可能负责创建和删除RealSubject的实例。

3.代理模式的使用场景 

代理模式可以控制客户端对真实对象的访问,从而限制某些客户端的访问权限,此外代理模式还常用在访问真实对象之前或之后执行一些额外的操作(比如记录日志),对功能进行扩展。

以上特性决定了代理模式在以下几个场景中有着广泛的应用:

  • 虚拟代理:当一个对象的创建和初始化比较昂贵时,可以使用虚拟代理,虚拟代理可以延迟对象的实际创建和初始化,只有在需要时才真正创建并初始化对象。
  • 安全代理:安全代理可以根据访问者的权限决定是否允许访问真实对象的方法。

但是代理模式涉及到多个对象之间的交互,引入代理模式会增加系统的复杂性,在需要频繁访问真实对象时,还可能会有一些性能问题。

4.代理模式和适配器模式有什么区别

代理模式的主要目的是控制对对象的访问。通常用于在访问真实对象时引入一些额外的控制逻辑,如权限控制、延迟加载等。

适配器模式的主要目的是使接口不兼容的对象能够协同工作。适配器模式允许将一个类的接口转换成另一个类的接口,使得不同接口的类可以协同工作

5.C++实现代理模式

【设计模式专题之代理模式】7-小明买房子 (kamacoder.com)icon-default.png?t=N7T8https://kamacoder.com/problempage.php?pid=1088

 题目描述

小明想要购买一套房子,他决定寻求一家房屋中介来帮助他找到一个面积超过100平方米的房子,只有符合条件的房子才会被传递给小明查看。

输入描述

第一行是一个整数 N(1 ≤ N ≤ 100),表示可供查看的房子的数量。

接下来的 N 行,每行包含一个整数,表示对应房子的房屋面积。

输出描述

对于每个房子,输出一行,表示是否符合购房条件。如果房屋面积超过100平方米,输出 "YES";否则输出 "NO"。

输入示例

3
120
80
110

输出示例

YES
NO
YES

思路分析:

根据代理模式的组成,我们要有一个抽象主题(抽象类),抽象类声明真实主题和代理对象实现的业务方法。这里的业务方法就是买房子。再次基础上,我们需要有一个对应的真实主题(具体的类,继承于刚才的抽象主题),是能够创建出客户端最终要访问的对象。最后,要有一个代理者类来控制真实主题。对于接口函数的参数,由于题目要判断房子的面积,所以要有一个参数area。

代码实现:

#include<iostream>
using namespace std;//1、定义抽象主题 买房子
class PurchaseHouse{
public://定义一个房屋筛选的纯虚函数,使得抽象主题这个类为抽象类virtual void HouseFilter(int area) = 0;
};//2、定义真实主题,继承上面的抽象主题
class Purchase : public PurchaseHouse{
public:virtual void HouseFilter(int area){cout<<"YES"<<endl;}
};//3、定义代理者类,里面要包含真是主题的实例
class Proxy{
private: //定义真实主题实例Purchase purchase;
public://定义给客户端提供的查询借口void SearchHouse(int area){//调用真实主题的对象的方法来对面积做比较if(area > 100){purchase.HouseFilter(area);}else {cout<<"NO"<<endl;}}
};int main()
{//客户端程序//定义代理商实例Proxy MyProxy;//输入信息int N, area;cin>>N;for(int i=0; i<N; i++){cin>>area;//输入房屋面积后就可以通过代理商进行房屋查询了MyProxy.SearchHouse(area);}return 0;
}

关于load的写法,可以参考这篇博文。设计模式之代理模式(C++)_c++ 代理模式-CSDN博客icon-default.png?t=N7T8https://zhaitianbao.blog.csdn.net/article/details/129949951

相关文章:

C++设计模式|结构型 代理模式

1.什么是代理模式&#xff1f; 代理模式Proxy Pattern是一种结构型设计模式&#xff0c;用于控制对其他对象的访问。 在代理模式中&#xff0c;允许一个对象&#xff08;代理&#xff09;充当另一个对象&#xff08;真实对象&#xff09;的接口&#xff0c;以控制对这个对象的…...

C语言 带头双向循环链表的基本操作

带头双向循环链表的基本操作 结构体定义初始化创建新节点头插头删尾插尾删查找在指定位置之后插入删除指定位置的值打印 结构体定义 typedef int DataType; typedef struct LinkNode {DataType data;struct LinkNode* prev;struct LinkNode* next; }LNode;初始化 有两种初始化…...

MATLAB中扩展卡尔曼滤波误差估计的关键点

在MATLAB中&#xff0c;对于扩展卡尔曼滤波&#xff08;EKF&#xff09;的误差估计&#xff0c;主要涉及对系统状态估计的准确性和精度的评估。EKF是一种适用于非线性系统的状态估计方法&#xff0c;它通过递归的方式&#xff0c;结合系统的动态模型和观测模型&#xff0c;来预…...

SpringBoot温习

1.1 Spring Boot ​ Spring Boot是一个开源的Java框架&#xff0c;由Pivotal团队&#xff08;现在是VMware的一部分&#xff09;开发&#xff0c;它是Spring框架的一个模块&#xff0c;旨在简化Spring应用程序的初始搭建以及开发过程。 Spring Boot的核心目标是让开发者尽可能…...

Spring Cloud:构建高可用分布式系统的利器

摘要&#xff1a;本文将介绍Spring Cloud&#xff0c;一个基于Spring Boot的开源微服务架构工具集。我们将探讨Spring Cloud的核心组件、特性以及如何使用Spring Cloud构建高可用、分布式系统。通过本文&#xff0c;读者将了解到Spring Cloud在实现微服务架构中的应用和优势。 …...

IT技术 | 电脑蓝屏修复记录DRIVER_IRQL_NOT_LESS_OR_EQUAL

我的台式机是iMac 2015年的&#xff0c;硬盘是机械的&#xff0c;时间久了运行越来越慢。后来对苹果系统失去了兴趣&#xff0c;想换回windows&#xff0c;且想换固态硬盘&#xff0c;就使用winToGo 搞了双系统&#xff0c;在USB外接移动固态硬盘上安装了win10系统。 最近&…...

windows 下编译 TessRact+leptonica 识别图片文字

目录 1、下载 2. 编译基础依赖库 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 编译tifflib 4. 配置nasm到系统环境中 5. 编译 libjpeg-turbo 6 编译leptonica 7. 编译tesseract 8. 测试验证 1、下载 下载tesseract5.3.2 下载leptonica1.83.1 下载l…...

如何把docker里的内容拷贝出来

如何把docker里的内容拷贝出来 要从Docker容器中复制文件或目录出来&#xff0c;可以使用docker cp命令。以下是基本的命令格式和示例&#xff1a; 命令格式&#xff1a; docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH示例&#xff1a; 假设你有一个名为my_container的…...

OpenAI开始训练新的前沿模型——但GPT-5至少在90天内不会推出

ChatGPT 制造商 OpenAI 今早宣布&#xff0c;已开始训练其新的“前沿模型”&#xff0c;并成立了一个新的安全委员会&#xff0c;由现任董事会成员 Bret Taylor&#xff08;OpenAI 董事会主席兼客户服务初创公司 Sierra AI 联合创始人、前谷歌地图负责人和前 Facebook 首席技术…...

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理进行身…...

mysql binlog查看指定数据库

1.mysql binlog查看指定数据库的方法 MySQL 的 binlog&#xff08;二进制日志&#xff09;主要记录了数据库上执行的所有更改数据的 SQL 语句&#xff0c;包括数据的插入、更新和删除等操作。但直接查看 binlog 并不直观&#xff0c;因为它是以二进制格式存储的。为了查看 bin…...

React + SpringBoot开发用户中心管理系统

用户中心项目搭建笔记 技术栈 前端技术栈 “react”: “^18.2.0”,ant-design-pro 后端技术栈 SpringBoot 2.6.x 项目源码地址 https://gitee.com/szxio/user-center 前端项目搭建 快速搭建一个后端管理系统项目框架 初始化 antDesignPro 官网&#xff1a; https://…...

移动机器人定位与导航实训记录

本次实训主要学习ros-tf的使用、slam使用、机器人自主导航&#xff0c;我先简单发出来&#xff0c;等我整理完再重新编辑一边。...

彩灯控制器设计 74ls160+ne555实现

一、选题背景 数字电子技术在我们生活中的应用非常之广泛,不论是在各个方面都会涉及到它,小到家用电器的自动控制,大到神舟九号和天空一号航天器的设计,都无可避免的要运用它。并且鉴于以理论推动实践及理论实践相结合为指导思想,特此用我们所学的理论知识来实践这次课程设…...

Windows API 速查

Windows API 函数大全 (推荐)&#xff1a;https://blog.csdn.net/xiao_yi_xiao/article/details/121604742Windows API 在线参考手册&#xff1a;http://www.office-cn.net/t/api/index.html?web.htmWindows 开发文档 (官方)&#xff1a;https://learn.microsoft.com/zh-cn/wi…...

智能名片小程序源码系统平台版 人人可创建属于自己的名片 前后端分离 带完整的源代码以及搭建教程

系统概述 智能名片小程序源码系统平台版是一款基于微信小程序的个性化名片搭建平台。该平台采用前后端分离的设计架构&#xff0c;前端提供丰富的界面元素和灵活的布局方式&#xff0c;后端则提供强大的数据支持和功能扩展能力。用户无需具备专业的编程知识&#xff0c;只需按…...

香橙派OrangePI AiPro测评 【运行qt,编解码,xfreeRDP】

实物 为AI而生 打开盒子 配置 扛把子的 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;Orange Pi AIpro无论在外观上、性能上还是技术服务支持上都非常优秀。采用昇腾AI技术路线&#xff0c;集成图形处理器&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32…...

重生之我要精通JAVA--第七周笔记

文章目录 IO流字符流字符流原理解析flush和close方法 文件拷贝代码文件加密解密修改文件中的数据 缓冲流字节缓冲流字符缓冲流例题 转换流序列化流序列化流/对象操作输出流 反序列化流序列化流/反序列化流的细节汇总打印流字节打印流字符打印流 解压缩流压缩流Commons-io常见方…...

MySQL—函数—数值函数(基础)

一、引言 首先了解一下常见的数值函数哪些&#xff1f;并且直到它们的作用&#xff0c;并且演示这些函数的使用。 二、数值函数 常见的数值函数如下&#xff1a; 注意&#xff1a; 1、ceil(x)、floor(x) &#xff1a;向上、向下取整。 2、mod(x,y)&#xff1a;模运算&#x…...

fintuning chatglm3

chatglm3介绍 ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型&#xff0c;在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上&#xff0c;ChatGLM3-6B 引入了如下特性&#xff1a; 更强大的基础模型&#xff1a; ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用…...

草台班子啊草台班子:共享电源导致的BUG(供电不足)

某日吧&#xff08;其实就是今日&#xff0c;不过什么时候我又删帖重发也不一定啊&#xff09;&#xff0c;下工厂干活&#xff0c;机器里面没多的插座&#xff08;其实一个插座都没有&#xff0c;但是有一个24V电源的的设备&#xff09;&#xff0c;于是带队的下令并着接&…...

java递归计算文件夹和文件大小

背景 背景发现电脑c盘占用过高,然而我却不清楚是哪些文件占用了磁盘空间,于是我希望用程序来帮我完成这件事。小插曲:开始的时候,我使用python来做的,结果发现效率实在是太低,最后用java重写了一波。有需要的同学可以拿去修改一些。 代码 import java.io.File; import ja…...

硬币检测电路设计

一、来源&#xff1a;凡亿教育 第一场&#xff1a;硬币检测装置原理分析、电路设计以及器件选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Zh4y1V7Px/?p1&vd_source43eb1cb50ad3175d7f3b9385905cd88f 二、开发软件&#xff1a;KEIL MDK 三、主控芯片&#…...

3.基础光照

从宏观上讲渲染包含了两大部分&#xff1a;决定一个像素的可见性&#xff0c;决定一个像素的光照计算 而光照模型就是用于决定在一个像素上决定怎样的渲染光照计算。 一、我们是如何看到这个世界的 1.光源 实时渲染中&#xff0c;我们通常把光源当成一个没有体积的点&#…...

Image Search-这是你的图像搜索

Image Search-这是你的图像搜索 什么是图像搜索图像搜索开通图像搜索商品图片搜索图片搜索图片新增批量操作OSS-创建bucket上传文件创建increment.meta并上传元信息导出 体验感受 什么是图像搜索 在接触一个新的产品时&#xff0c;我们首先要知道这款产品是什么&#xff1f;那…...

对GPT-4o的评价:技术革新与未来展望

目录 引言一、GPT-4o的技术背景1.1 GPT系列的发展历程1.2 GPT-4o的技术特点 二、版本间的对比分析2.1 GPT-3与GPT-4的对比2.2 GPT-4与GPT-4o的对比 三、GPT-4o的技术能力3.1 自然语言处理3.2 多模态处理3.3 任务定制化 四、个人整体感受4.1 交互体验4.2 应用场景4.3 未来展望 五…...

【TB作品】msp430f5529单片机,dht22,烟雾传感器

功能 //硬件&#xff1a;msp430f5529、dht22、LCD1602、蜂鸣器、烟雾传感器、蓝牙模块。 //功能&#xff1a;读取温湿度、烟雾浓度显示到屏幕&#xff1b; //按键调节三个报警数值&#xff1b; //温度、湿度、烟雾浓度&#xff0c;任意一个大于报警数值就蜂鸣器报警&#xff1…...

uni-app全局弹窗的实现方案

背景 为了解决uni-app 任意位置出现弹窗 解决方案 一、最初方案 受限于uni-app 调用组件需要每个页面都引入注册才可以使用&#xff0c;此方案繁琐&#xff0c;每个页面都要写侵入性比较强 二、改进方案 app端&#xff1a;新建一个页面进行跳转&#xff0c;可以实现伪弹窗…...

Love-Yi情侣网站3.0存在SQL注入漏洞

目录 1. 前言 2. 网站简介 3. 寻找特征点 3.1 第一次尝试 3.2 第二次尝试 4.资产搜索 5.漏洞复现 5.1 寻找漏洞点 5.2 进行进一步测试 5.2.1 手动测试 1.寻找字段 2.寻找回显位 3.查询当前用户 5.2.2 sqlmap去跑 6.总结 1. 前言 朋友说自己建了一个情侣网站,看到…...

自然语言处理(NLP)—— 神经网络语言处理

1. 总体原则 1.1 深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程 下图展示了自然语言处理&#xff08;NLP&#xff09;领域内使用的深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程的简化图。 在神经网络的NLP领域&#xff1a; 语料…...