设计模式之代理模式

JS设计模式之代理模式 Star这个类就是明星,StarProxy这个类就是明星经纪人,假如我们是商家,现在我们想请这个明星来参加我们的活动,我们开始和经纪人谈价格,talk出价1w,此时经纪人会做一个判断,如果价格大于等于1w,这个活动就比较适合,可以参加,代理就会去通知明星演出,如果小于1w的话,就不会,这个就是简单的代理模式,我们要访问明星,需要经过经纪人(也就是代理),才能去访问。其实就是给一个对象提供一个代理,如果要访问这个对象必须经过这个代理,先说,这个模式的优点是什么。 阅读详情

Proxy代理模式

作用:为其他对象提供一种代理以控制对这个对象的访问。

代理的种类:

如果按照使用目的来划分,代理有以下几种:

远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。 也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。  

Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。 用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。

Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。 防火墙(Firewall)代理:保护目标,不让恶意用户接近。 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。 是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。

在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(Smart Reference Proxy)和保护(Protect or Access)代理是最为常见的代理模式。

UML图:

Subject:声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。

Proxy:代理主题角色内部含有对真是主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;控制真实主题的应用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对象。

ConcreteSubject:定义了代理角色所代表的真实对象。

代码如下:

Proxy.h

复制代码
 1 #ifndef _PROXY_H_
 2 #define _PROXY_H_
 3 
 4 // 定义了Proxy和ConcreteSubject的公有接口,
 5 // 这样就可以在任何需要使用到ConcreteSubject的地方都使用Proxy.
 6 class Subject
 7 {
 8 public:
 9     virtual ~Subject();
10     virtual void Request()=0;
11 protected:
12     Subject();
13 };
14 
15 class ConcreteSubject : public Subject
16 {
17 public:
18     ConcreteSubject();
19     ~ConcreteSubject();
20     virtual void Request();
21 };
22 
23 //定义代理类
24 class Proxy : public Subject
25 {
26 public:
27     Proxy();
28     ~Proxy();
29     void DoSomething1();
30     virtual void Request();
31     void DoSomething2();
32 private:
33     Subject* _subject;
34 };
35 #endif
复制代码

Proxy.cpp

复制代码
 1 #include "Proxy.h"
 2 #include "iostream"
 3 
 4 using namespace std;
 5 
 6 Subject::Subject()
 7 {}
 8 
 9 Subject::~Subject()
10 {}
11 
12 ConcreteSubject::ConcreteSubject()
13 {}
14 
15 ConcreteSubject::~ConcreteSubject()
16 {}
17 
18 void ConcreteSubject::Request()
19 {
20     cout << "ConcreteSubject::Request" << endl;
21 }
22 
23 Proxy::Proxy() : _subject(NULL)
24 {}
25 
26 Proxy::~Proxy()
27 {}
28 
29 void Proxy::DoSomething1()
30 {
31     cout << "Proxy::DoSomething1" << endl;
32 }
33 
34 void Proxy::DoSomething2()
35 {
36     cout << "Proxy::DoSomething2" << endl;
37 }
38 
39 void Proxy::Request()
40 {
41     if(NULL == this->_subject)
42     {
43         this->_subject = new ConcreteSubject();
44     }
45 
46     this->DoSomething1();//表示额外附加的操作
47 
48     this->_subject->Request();//代理的实体类操作
49 
50     this->DoSomething2();//表示额外附加的操作
51 }
复制代码

Main.cpp

复制代码
1 #include "Proxy.h"
2 
3 int main()
4 {
5     Proxy* proxy = new Proxy();
6     proxy->Request();
7 
8     return 0;
9 }
复制代码

C++设计模式——Proxy代理模式 C++设计模式入门 阅读详情

相关推荐

设计模式C++学习之代理模式(Proxy)

设计模式C++学习之代理模式(Proxy)

Proxy代理模式

Extensions 的编写     理解了这些运行机制以后,本章着手介绍Extensions 的编写,但凡写程序的人都知道hello world,那好,就从hello world开始。1.1Hello World这是摘自《PHP手册》的示例程序:      这段代码实现了一个简单的extension,首先它包含了“php.h”,这是所有extensions都需要包含的头文件,它定义、声明了

tianmo2010的专栏 911

c语言版数据结构课程设计 学生成绩管理系统

此学生成绩管理系统完成15项功能,是我经过很多次的修改得到的。花费时间不短,功能齐全,主要完成了:输入,输出,插入,修改,删除,查询,读取文件,写入文件,复制文件,建立索引,显示各种情况下的信息,追加学生信息等等功能。一共15项。   代码如下: // shujujiegou.cpp : 定义控制台应用程序的入口点。///**本程序采用数组链表形式,原因:数组查询速度快,数组也能实现动态存储

Java 1万+

在c++ 20下使用微软的proxy库替代传统的virtual动态多态

上面同样的需求,换成proxy库来实现是这样的: 可以看到,换成proxy库之后,不再有virtual虚函数,而且是非侵入式的,我觉得这种方式非常棒,很优雅。至于性能测试,我没有去做。详情见这个开源仓库地址:https://github.com/microsoft/proxy

zhllxt的专栏 4105

倍福Twincat 3.0软件与C++通讯问题(ADS通讯)

倍福Twincat 3.0软件与C++通讯问题 倍福公司所开发的Twincat 3.0软件是基于Visual studio开发环境的一款自动化软件,目前其与C++程序通讯的方式主要还是靠ADS-DLL接口进行数据和信息传递,作者在Visual C++上进行混合编程开发,通过TwinCAT路由器和C语言API函数实现混合编程。 倍福软件提供: TcAdsDll.dll—动态链接库; TcAdsDll...

weixin_42811651的博客 1万+

keil4.72添加GD32F10x芯片

1. 下载 GD32F10x_AddOn_V2.0.1.rar,解压缩。 2. 安装 运行GigaDevice.GD32F10x_AddOn.2.0.0.exe 安装位置 再新建工程,发现已经有GD32F10x 3. 增加的文件分析 运行GigaDevice.GD32F10x_AddOn.2.0.0.exe后,在keil文件夹种增加文件如下: ...

TrueLink的博客 2762

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

一 定义 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 代理模式分类 (1)远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。 (2)虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。例如:图片加载的时候。 (3)安全代理,用来控制真是对象访问时的权限。 (4)智能指引,是指当调用真实的对象...

janeqi1987的专栏 855

保姆级教程:在爱快iKuai虚拟机里装OpenWrt旁路由,实现去广告和特殊功能

本文提供在爱快iKuai虚拟机中安装OpenWrt旁路由的详细教程,帮助用户实现去广告和特殊功能扩展。通过分步指导,包括虚拟机配置、网络设置和功能优化,打造稳定高效的家庭网络环境,特别适合软路由爱好者和网络管理员。

weixin_31364787的博客 818

设计模式之代理模式(Proxy)的C++实现

代理模式(Proxy)的C++实现。在组件的开发过程中,有些对象由于某种原因(比如对象创建的开销很大,或者对象的一些操作需要做安全控制,或者需要进程外的访问等),会使Client使用者在操作这类对象时可能会存在问题:(1)使用者直接访问这种对象会使系统带来很多麻烦。(2)或者使用者使不能直接访问这类对象;使用代理模式就可以解决此类问题。有一个主题类,该类具有请求功能和数据转换功能。而Client使用者不能直接访问和操作它,只能间接的通过其它类进行访问操作。3、代理模式的代码实现。

hanxiaoyong_的博客 1567

02-Cesium-实现天地图标记

首先天地图申请token,然后Cesium-实现天地图标记详细说明

m0_62785037的博客 1171

Open3D 高斯牛顿法优化的ICP点云配准

本文介绍了基于高斯牛顿法的ICP点云配准算法。算法通过最小化源点云与目标点云之间的误差函数,求解最优的刚性变换参数(平移向量和欧拉角)。核心内容包括:1)建立误差函数和目标函数;2)推导雅可比矩阵计算,特别是旋转导数的李代数近似;3)详细阐述高斯牛顿法的迭代流程,包括变换计算、最近邻搜索、参数更新等步骤;4)分析算法的优缺点,指出其具有二阶收敛速度但可能陷入局部最优。最后给出了完整的数学推导过程,包括误差函数的泰勒展开和目标函数的近似优化。该算法适用于三维点云配准任务,但需要良好的初始位姿以避免局部收敛问题

点云侠的博客 128

设计模式之代理模式(ProxyPattern)

设计模式之代理模式(ProxyPattern) 1.图和分析 有三个角色: 代理角色 :房屋中介,代理真实角色,一般会进行一些附属操作 真实角色:房主,执行自己的业务代码即可 抽象角色:租房,一般是接口或者抽象类 2.静态代理 根据上面的图,代码实现 租房接口(interface) public interface Rent { void rent(); } 房主类,实现...

qq_38056518的博客 242

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

设计模式之代理模式ProxyPattern(六)

1、什么是代理模式?代理模式是23种设计模式中的一种。代理模式是一种结构型设计模式,它允许为其他对象提供一个替代品或占位符,以控制对这个对象的访问。2、代理模式的角色构成抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样代理类可以通过实现该接口来代理真实主题。真实主题(Real Subject):定义了代理所代表的真实对象。代理(Proxy):持有对真实主题的引用,并实现了与真实主题一样的接口,客户端通过代理来访问真实主题,同时可以在访问真实主题前后进行一些额外操作。

徐泗空的博客 1460

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[DesignPattern]ProxyPattern

代理模式玩过扮白脸、扮黑脸的游戏吗?这就是代理要做的:控制和管理访问。还记得状态模式的那台糖果机吗?现在我们需要远程监控糖果机。(在开始编码之前,需要收集需求)。远程代理 远程代理就好比“远程对象的本地代表”。何谓“远程对象“?这是一种对象,活在不同的Java虚拟机(JVM)堆中。 你的客户对象所做的就像是在做远程方法调用,但其实只是调用本地堆中的”代理“上的方法,再由代理处理所有网络通信的低层细节

xy_cpp的博客 416

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

您的设计模式——代理模式【Proxy Pattern 】

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被 代理的人能干活呀。 比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的: 先定义一种类型的女人:package com.alex.patterns.proxy;/**

410

设计模式—代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 意图:为其他对象提供一种代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来...

dmxhcwk90096748的博客 97

java设计模式之 代理模式【Proxy Pattern】 详解

首先我们举个例子说明一下什么是策略模式: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被 代理的人能干活呀。 比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的: 先定义一种类型的女人: package com.cbf4lif...

蛋蛋淡淡定的庄园 299

设计模式代理模式(ProxyPattern)

核心模块:抽象角色,真实角色,代理角色 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:适合不方便直接访问对象的情况; 优点:协调了调用者和被调用者,减少耦合,起到了保护目标对象的作用; 缺点:由于使用代理可能会使请求速度变慢; 注意: 1,与中介者模式区别,中介者对中介双方权重

didiao11300的专栏 356

Java设计模式之代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网上连接、存储器中的大对象、文件或其它 昂贵或无法复制的资源。 著名的代理模式例子为引用计数(英语:reference counting)指针...

Expaner的博客 171

设计模式(DesignPattern)之代理模式(Proxy)

1、定义         代理模式也称为委托模式,为一个对象提供一个代理对象,以此来控制被代理对象的访问,简单来说就是代理对象代替被代理对象来完成一些事情。         代理模式一般分为静态代理和动态代理:         静态代理:代理类在代码编译以前就已经存在。         动态代理:运行时动态的创建代理对象,可以很灵活的代理自己想要代理的对象,通过反射机制来实现。 2、使用...

inventor1024的博客 535

设计模式---代理模式(DesignPattern_Proxy)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 138

《设计模式》代理模式

定义代理模式就是为被访问的目标对象提供一个代理,此时代理对象充当访问对象和目标对象之间的媒介,通过代理对象实现对目标对象的访问。被代理的对象可以是远程对象、创建开销大的对象以及需要安全控制的对象,Java 中的代理按照代理的生成时机不同分为静态代理和动态代理,静态代理就是在编译期就生成代理对象,而动态代理是在 Java 运行时动态生成,而动态代理又分为 JDK 动态代理和 Cglib 动态代理两种。代理模式的角色组成抽象主题类(Subject):通过接口或抽象类声明真实主题和代理对象实现的业务方法。

华仔仔的博客 4000
上一篇: STL常用算法4----mem_fun
下一篇: 同步对象的区别与联系
htt9931
博客等级 码龄24年 43粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值