一,基本部分
这个例子是以送花的形式为基础向我们介绍的
比如说A是校花,B认识A,也认识C,C想要追求A,
这时候C就拜托B去送花,送巧克力,并且表达爱意,
这样一来C和A并没有直接的见面,但是C的东西都成功的送到了A的手里
在以上 的过程中就是代理模式的典型,其中B起到的就是代理的作用
我们用UML来显示:http://github.crmeb.net/u/defu
其中代理里面含有追求者的引用,也就是在代理模式的构造函数中对追求者进行初始化,然后进行调用
代码如下:
追求者:
代理:
(可以看到追求者在代理的构造函数中实现了构造函数的初始化)
客户端:
综上所述,追求者和代理应该实现相同的接口
二,代理模式的概述
标准的代理模式如下所示:
Subject(抽象主题角色):声明了真实主题和代理主题的共同接口,那么这样一来在任何使用真实主题的地方都可以使用代理主题
Proxy(代理主题角色):代理主题角色内部含有对于真实主题的引用,从而在任何时候操作真实主题的对象;代理主题角色提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题
控制真实主题的应用负责在需要的时候创建真实主题对象(和删除真实主题对象)
RealSubject(真实主题角色):定义了代理角色所代表的真实对象
代理模式的定义:
代理模式给某一个对象提供一个替身或占位符,以控制这个对象的访问
所谓代理,就是一个人或者一个机构代表另一个人或者另外一个机构采取行动。在一些情况下,一个客户不想或者不能够引用一个对象,而代理对象可以在客户端或者目标对象之间起到中介的作用。
三,真实应用场景
(1)在软件系统中,我们无时不在跨越障碍,当我们访问网络上一台计算机的资源时,我们正在跨越网络障碍,当我们去访问服务器上数据库时,我们又在跨越数据库访问障碍
跨越这些障碍有时候是非常复杂的,如果我们更多的去关注处理这些障碍问题,可能就会忽视了本来应该关注的业务逻辑问题
我们以一个简单的数学逻辑为例:
Powered by Ad.Plus
下面有一个类只是简单的完成了加减乘除运算
如果说这个计算程序部署在我们本地计算机上,使用就非常的简单,但是如果没有在我们本地的计算机上,而是在另外一台服务器上,也就是说我们的客户程序和Math类根本不在一个地址空间内,我们现在要面对的是跨越Internet这样一个网络障碍
解决办法:
为了解决由于网络等障碍引起的复杂性,就引出了Proxy模式,我们使用一个本地的代理来代替Math类来处理一切,也就是说为我们的系统引入了一层间接层
我们在MathProxy中实现对Math数据类的访问,让MathProxy来代替网络上的Math类,这样就看到MathProxy就好像是本地的Math类,他与客户端程序在同一个地址空间内:
进一步考虑:
这样虽然实现了处于同一个地址空间的功能,但是MathProxy并不一定会完全实现Math类中的所有功能,
所以这个是时候,我们可以在两者之间加上一个接口,使两者都实现这个接口中的功能,那么这样一来就实现了所有Math中的功能
(2)远程代理
为一个位于不同的地址空间的对象提供一个局域代表对象。可以隐藏一个对象存在于不同地址空间的事实。这个不同的地址空间可以是在本机器中,也可以是在另一台机器中。远程代理又叫做大使(Ambassdor),个人觉得大使是负责对外交互,远程代理也属于一个中间层负责交互
可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户端可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部分的网络通信工作,远程代理的结构图如下:
(3)虚拟代理
代理对象可以在必要的时候才将被代理的对象进行加载,代理可以对加载的过程加以必要的优化。当一个模块的加载十分消耗资源的时候。虚拟代理的优点就十分的明显
下面有两个具体的例子:
如果那个对象是一个很大的图片,需要花费很长的时间才能显示出来,那么当这个图片包含在文档中的时候,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这个时候就需要做个图片Proxy来代替真正的图片
如果那个对象在Internet的某个远端的服务器上,直接操作这个对象因为网络速度的原因可能比较慢,那我们可以先用Proxy来代替那个对象
总之原则,对于开销很大的对象,只要在使用它时才创建,可以帮助我们节省很多宝贵的内存资源
(4)保护代理
可以在运行的时候对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象
授权机制,不同级别的用户对同一个对象拥有不同的访问权利,如JIVE论坛系统中,就使用Proxy进行授权机制控制,访问论坛就有两种人,注册用户和游客,JIVE中就通过类似于ForumProxy这样的代理来控制这两种用户对论坛的访问的权限
四,Proxy的本质和扩展应用
本质:控制对象的访问
扩展应用:
订单系统:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。