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


一、概述
    代理模式是一种结构型模式,在很多不同的场合具有广泛的分类和应用。其主要实现的思想是在客户端和真正要访问的对象之间引入一个
代理对象(间接层),于是,以往客户端对真正对象的访问现在变成了通过代理对象进行访问,代理对象在这里起到了一个中介或者桥梁作用。
引入代理对象的目的主要是可以为客户端增加额外的功能、约束或者针对客户端的调用屏蔽一些复杂的细节问题。

二、基本概念与示例
    代理模式的实质是通过引入一个代理类来为原始类(被代理类)增加额外的能力,这些额外的能力可能是指一些新功能、新服务,也可能
是一些约束或者限制等。那么现在试着考虑一个例子,通过浏览器访问某个网站,最简单的方式就是在浏览器中输入网站的地址来直接访问。

class CWebAddr
{
public:
    virtual void visit() = 0;
    virtual ~CWebAddr(){}
};

class CWebAddr_Shopping : public CWebAddr
{
public:
    virtual void visit()
    {
        //访问购物网站复杂通信逻辑
        cout << "访问CWebAddr_Shopping购物网站" << endl;
    }
};

class CWebAddr_Video : public CWebAddr
{
public:
    virtual void visit()
    {
        //访问视频网站复杂通信逻辑
        cout << "访问CWebAddr_Video视频网站" << endl;
    }
};

//主函数
int main()
{
    CWebAddr *pShopping = new CWebAddr_Shopping();
    pShopping->visit();
    
    CWebAddr *pVideo = new CWebAddr_Video();
    pVideo->visit();
    
    delete pShopping;
    delete pVideo;
    
    return 0;
}

上述代码执行结果没问题,描述主要是直接访问某个或者某些网站,那么我们也可以引入代理类帮助我们访问这些网站,
针对以上代码做出调整:
class CWebAddrProxy : public CWebAddr
{
public:
    CWebAddrProxy(CWebAddr* pWebAddr) : m_webAddr(pWebAddr){}
    
public:
    virtual void visit()
    {    
        m_webAddr->visit();
    }
private:
    CWebAddr* m_webAddr;    
};

//主函数
int main()
{
    CWebAddr *pShopping = new CWebAddr_Shopping();
    CWebAddr *pVideo = new CWebAddr_Video();
    
    CWebAddrProxy *pWebproxy1 = new CWebAddrProxy(pShopping);
    pWebproxy1->visit();
    
    CWebAddrProxy *pWebproxy2 = new CWebAddrProxy(pVideo);
    pWebproxy2->visit();
        
    delete pShopping;
    delete pVideo;
    delete pWebproxy1;
    delete pWebproxy2;
    
    return 0;
}

三、代理模式定义与角色
    引入代理模式的定义:为其他对象提供一种代理,以控制对这个对象的访问。代理模式通过创建代理对象来代表真实对象,客户端操作代理
对象与操作真实对象并没有什么不同。当然,最核心、最本质的功能,最终还是需要代理对象操纵真实对象来完成。
代理模式UML图中涉及三个角色:
(1)Subject(抽象对象)。该类定义真实主题与代理主题的共同接口,这样,在真实主题的地方都可以使用代理主题。
(2)Proxy(代理主题)。该类内部包含了对真实主题的引用,从而可以对真实主题进行访问。代理主题中一般会提供与真实主题相同的接口,以
达到可以取代真实主题的目的。同时也可以对真实主题的访问进行约束和限制,也能够控制必要时的创建/删除真实主题。
(3)RealSubject(真实主题)定义代理主题代表的真实对象,真正的业务是在真实主题中实现的,客户端通过代理主题间接访问真实主题中的
接口。

四、代理模式的应用场合
    代理模式UML图分厂简单,总结起来也简单----在软件设计中,增加间接层来获取更大的灵活性和增加更多的控制。在实际中,代理模式可能
会在许多场合得到应用,并且其实现可能会非常复杂。
1)远程代理
2)虚拟代理
3)保护代理
4)缓存/缓冲代理
5)智能引用代理
6)写时复制优化代理

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

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

相关文章

数学建模-规划工具箱yalmip

官网下载 实例 %% yalmip 求解 yalmip clc;clear;close all; %% %sdpvar实型变量 intvar 整形变量 binvar 0-1型变量 psdpvar(3,1); %定义变量 %目标函数 要把求最大值转化为最小值 Objective-p(1)^2p(2)^2-p(2)*p(3);%约束条件 Constraints[0<p<1,(p(1)^2p…

音视频FAQ(一):视频直播卡顿

一、摘要 本文介绍了视频直播卡顿的四个主要原因&#xff0c;用户网络问题、用户设备性能问题、技术路线的选择和实现问题。因本文主要阐述视频直播的卡顿&#xff0c;故技术路线的实现指的是&#xff1a;CDN供应商的实现问题&#xff0c;包含CDN性能不足、CDN地区覆盖不足。对…

Vc - Qt - 绘制窗口背景色

要在Qt中绘制一个背景颜色&#xff0c;你可以使用Qt的绘图功能来完成。下面是一种简单的方法&#xff1a; 步骤1&#xff1a;在你想要绘制背景颜色的QWidget&#xff08;例如QMainWindow或QDialog&#xff09;的派生类中&#xff0c;重写 它的paintEvent函数。步骤2&#xff1a…

matlab中exp和expm的区别

exp()为数组 X 中的每个元素返回指数 e x e^{x} ex expm()计算 X 的矩阵指数。 两个函数传入矩阵后计算的结果是不同的&#xff0c;千万不能混淆。之前曾经想当然得把exp里传入矩阵当矩阵指数使用&#xff0c;也未验证正确性&#xff0c;实不应该。

uni-app中使用pinia

目录 Pinia 是什么&#xff1f; uni-app 使用Pinia main.js 中引用pinia 创建和注册模块 定义pinia方式 选项options方式 定义pinia 页面中使用 pinia选项options方式 函数方式 定义pinia 页面中使用 函数方式 定义的pinia Pinia 是什么&#xff1f; Pinia&#xff0…

用户新增预测——baseline学习笔记

一、赛题理解 1. 赛题名称 用户新增预测挑战赛 2. 赛题数据集 赛题数据由约62万条训练集、20万条测试集数据组成&#xff0c;共包含13个字段。其中uuid为样本唯一标识&#xff0c;eid为访问行为ID&#xff0c;udmap为行为属性&#xff0c;其中的key1到key9表示不同的行为属性…

S-Video端口接口芯片ESD保护方案图

在音/视频领域&#xff0c;除了常见的HDMI、DVI接口等&#xff0c;还有一些冷门的接口&#xff0c;比如S-Video端口&#xff0c;相信很多人可能都没有听说过。S-Video视频端口同样拥有较好的数据传输功能。S-Video二分量视频端口&#xff0c;英文全称Separate Video&#xff0c…

Macbook 终端 git 命令补全和提示

Mac OS自带的终端&#xff0c;用起来虽然有些不太方便&#xff0c;界面也不够友好&#xff0c;关键是在windows上用习惯了自动补全功能&#xff0c;在Mac上一个个的拼写单词是真的难受&#xff0c;逼着我记英文单词。 经过一天的磨合&#xff0c;我实在忍不了&#xff0c;在网上…

复习vue3,简简单单记录

这里的知识是结合视频以及其他文章一起学习&#xff0c;仅用于个人复习记录 ref 和reactive ref 用于基本类型 reactive 用于引用类型 如果使用ref 传递对象&#xff0c;修改值时候需要写为obj.value.attr 方式修改属性值 如果使用reactive 处理对象&#xff0c;直接obj.att…

Lua学习记录

Lua基础了解 Lua的注释通过 (-- 单行注释&#xff0c;--[[ ]] 多行注释)可以不加&#xff1b; 多个变量赋值&#xff0c;按顺序赋值&#xff0c;没有则为nil&#xff1b; function的简单用法&#xff0c;多个返回值配合多重赋值&#xff0c;以end为结束标志 Lua下标从1开始&…

JSP-学习笔记

文章目录 1.JSP介绍2 JSP快速入门3 JSP 脚本3.1 JSP脚本案例3.2 JSP缺点 4 EL表达式4.1 快速入门案例 5. JSTL标签6. MVC模式和三层架构6.1 MVC6.2 三层架构 7. 案例-基于MVC和三层架构实现商品表的增删改查 1.JSP介绍 概念 JSP&#xff08;JavaServer Pages&#xff09;是一种…

Azure存储账户

存储账户的概念 Azure存储账户是Azure提供的一种云存储解决方案&#xff0c;用于存储和访问各种类型的数据&#xff0c;包括文件、磁盘、队列、表格和Blob&#xff08;二进制大对象&#xff09;数据。存储账户可以基于访问模式和冗余需求来选择不同的类型&#xff0c;以满足应…

【MySQL--->表的操作】

文章目录 [TOC](文章目录) 一、创建表二、查看表三、修改表四、删除表drop table 表名; ![在这里插入图片描述](https://img-blog.csdnimg.cn/15227b8335364d41bd01b4b4dd83ee55.png) 一、创建表 语句格式:create table 表名(列名 类型,…)字符集 校验规则 存储引擎;字符集和校…

我还不知道?Android组件化插件化模块化

Android组件化、插件化和模块化是针对Android应用程序开发的一种架构设计思想和开发方式。 组件化&#xff08;Componentization&#xff09;&#xff1a; 组件化是将一个大型的Android应用程序拆分成多个独立的组件&#xff08;Module&#xff09;&#xff0c;每个组件可以独…

python使用装饰器记录方法耗时

思路 python使用修饰器记录方法耗时&#xff0c;目的是每当方法执行完后&#xff0c;可以记录该方法耗时&#xff0c;而不需要在每个方法的执行前后&#xff0c;去创建一个临时变量&#xff0c;来记录耗时。 方式一&#xff08;不推荐&#xff09;&#xff1a; 在每个方法的…

source insight 添加宏-文件头加注释

source insight 3.5 自带的一些宏&#xff0c;在安装目录下的 utils.em 文件中&#xff0c;用户也可以自己写文件&#xff0c;命令为xxx.em &#xff0c;然后把这个文件添加到项目中即可&#xff0c;添加后在菜单栏 Options -> Key Assignments 里输入macro 就能显示新添加的…

第一个ArkTS项目实践-鸿蒙ArkTS

第一个ArkTS项目实践-ArkTS 第一个ArkTS项目实践-ArkTS自定义组件的组成配置属性与布局配置属性布局 改变组件状态循环渲染列表数据代码ToDoItem组件ToDoList页面 效果参考资料 第一个ArkTS项目实践-ArkTS 本篇文章是官网上视频对ArkTS开发实践的第一个视频&#xff0c;主要是引…

Matplotlib数据可视化(三)

目录 1.绘图的填充 1.1 曲线下方区域的填充 1.2 填充部分区域 1.3 两条曲线之间的区域填充 1.4 直接使用fill进行填充 1.绘图的填充 绘图的填充可以调用fill_between()或fill()进行填充。 1.1 曲线下方区域的填充 x np.linspace(0,1,500) y np.sin(3*np.pi*x)*np.exp…

【C语言】每日一题(找到所有数组中消失的数字)

找到所有数组中消失的数字&#xff0c;链接奉上。 这里简单说一下&#xff0c;因为还没有接触到动态内存&#xff0c;数据结构&#xff0c;所以知识有限&#xff0c;也是尽力而为&#xff0c;结合题库的评论区找到了适合我的解法&#xff0c;以后有机会&#xff0c;会补上各种…

如何在HTML中使用React

突发奇想 查了查真的可以,官方文档: 在网站中添加 React – React 开始 引入js <!-- 开发环境使用 --><script src"https://unpkg.com/react18/umd/react.development.js"></script><script src"https://unpkg.com/react-dom18/umd/reac…