前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代理模式

代理模式

原创
作者头像
PHP开发工程师
修改2021-04-19 18:01:39
3210
修改2021-04-19 18:01:39
举报
文章被收录于专栏:thinkphp+vuethinkphp+vue

一,基本部分

这个例子是以送花的形式为基础向我们介绍的

比如说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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档