Proxy模式简介和用例

    在软件系统中,有些对象有时候由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),如果直接访问会给使用者或者系统结构带来很多麻烦,这时可以在客户程序和目标对象之间增加一层中间层,这个中间层就是代理。

    代理模式的定义:给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

代理模式可分为以下几类:

(1)远程代理:为一个位于不同的地址空间的对象提供一个局域代表对象。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。

(2)保护代理:控制对一个对象的访问,如果需要可以给不同的用户提供不同级别的使用权限。好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。

(3)虚拟代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。好处是代理对象可以在必要的时候才将被代理的对象加载。

(4)智能引用代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

这里给出两个使用该模式的例子:

应用一:虚拟代理

例如:word文档打开

Word文档通常会含有链接、图片、表格等对象,但是并不是每次刚打开word时都要创建和实例化这些对象,特别是实例化图片对象很消耗资源。事实上,我们没必要实例化所有图片,当我们在查看word时,每次只是看到其中的一部分,所以没有必要实例化所有资源,可以使用一个虚代理物件,代替图片被载入,来加快打开文档速度,当我们看下一页时再载入图片也不迟。

类图如图所示:

如上图所示,当文档被开启时, ProxyImage代理代替RealImage物件被载入,在还没卷动至图片显示处时,也就是还没有调用 ProxyImage的Draw()时,图片并不会被载入,因而可以加速文档的开启;如果需要显示图片了, ProxyImage的 Draw()会被调用,而这时才真正创建RealImage物件,以从硬盘中载入图片。

主要类代码:

 

public interface Image //Image公共接口
{public abstract void Draw();}//ProxyImage类实现Image接口public class ProxyImage implements Image{private RealImage realimage;public void Draw(){If(realimage==NULL){Realimage=new RealImage();}realimage.Draw();}}//RealImage类实现Image接口public class RealImage implements Image{public void Draw(){ Console.WriteLine(“载入图片……”);}}主程序public class App{public static void Main(){ProxyImage proxy = new ProxyImage();proxy.Draw();}}

 

应用二:远程访问

例子:远程数学运算访问

本地客户程序需要调用远程服务器提供的数学运算服务,也就是说数学运算服务和客户程序不在同一个地址空间之内,我们现在要面对的是跨越Internet这样一个网络障碍:这时候调用数学运算服务就没有下面那么简单了,因为我们更多的还要去考虑网络的问题,对接收到的结果解包等一系列操作。为了避免由于网络等障碍引起的复杂性,引用Proxy模式,用一个本地的代理来代替远程数学运算类打点一切,即为我们的系统引入了一层间接层,示意图如下

设计的类图如下:

如上图所示:我们在ProxMath中对实现数据类的访问,让ProxyMath来代替网络上的RealMath类,这样我们看到ProxMathy就好像是本地RealMath类,它与客户程序处在了同一地址空间内。

主要代码:

View Code
public interface Math //Math公共接口
{public abstract double Add(double x,double y);public abstract double Sub(double x,double y);public abstract double Mul(double x,double y);public abstract double Dev(double x,double y);}public class ProxyMath implements Math //Proxy类,继承于Math
{private RealMath realmath = new RealMath();//Proxy类中不光有调用Math类的方法,还包含一些网络通信,与远程服务器交换数据,此处省略。public double Add(double x,double y){return math.Add(x,y);}public double Sub(double x,double y){return realmath.Sub(x,y);}public double Mul(double x,double y){return realmath.Mul(x,y);}public double Dev(double x,double y){return realmath.Dev(x,y);}}public class RealMath implements Math{public double Add(double x,double y){return x + y;}public double Sub(double x,double y){return x - y;}public double Mul(double x,double y){return x * y;}public double Dev(double x,double y){return x / y;}}测试主程序public class App{public static void Main(){ProxyMath proxy = new ProxyMath();double addresult = proxy.Add(2,3);double subresult = proxy.Sub(2,3);double mulresult = proxy.Mul(2,3);double devresult = proxy.Dev(2,3);}}

 

从上面的两个例子可以概括出Proxy模式的工作原理:

首先,代理并不改变主题的接口,因为模式的用意是不让客户端感觉到代理的存在;其次,代理使用委派将客户端的调用委派给真实的主题对象,换言之,代理起到的是一个传递请求的作用;第三,代理在传递请求之前和之后都可以执行特定的操作(如网络通信、检查对象是否存在等),而不是单纯传递请求。

转载于:https://www.cnblogs.com/Yogurshine/archive/2012/12/25/2831860.html

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

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

相关文章

这个小姐姐真的很火辣......

1 穿着十分火辣的美女...▼2 你还有理了?▼3 学生:我们要把老师照片挂墙上!▼4 喜悦中带着阵阵悲伤...▼5 你瞅啥?瞅你咋地!▼6 一时竟没发现哪里不对▼7 老板,我们KTV最漂亮的都在这了▼你点的每个赞…

RPC调用框架比较分析

什么是RPC: RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 简言之,RPC使得程序能够像访问本地系统资源一样&am…

VS扩展CodeMaid代码整理插件

CodeMaid是Visual Studio的开源扩展,用于清理和简化我们的C#,C ,F#,VB,PHP,PowerShell,JSON,XAML,XML,ASP,HTML&#xff0…

Centos5 install vnc

2019独角兽企业重金招聘Python工程师标准>>> 很详细的install steps: http://wiki.centos.org/HowTos/VNC-Server#head-76401321dae4d80916a7fd7e710272a9b85c9485 ---------------------------------------------------------------------------------------------…

北大学霸隐居20年,王青松花光350万后,如今怎么样了?

全世界只有3.14 % 的人关注了爆炸吧知识传说我国,本科生遍地走,研究生多如狗。但一估算,从1977年高考恢复以来,国内现在的本科率竟然还不到5%。这样一想,30多年前的本科生数量肯定更少,也更珍贵。如果是北大…

文件给制实施规定的实例(GB8567-88)

尽管在文件编制中存在着很多灵活性,然而,文件的编制确实是非常必要的,其意义如前所述。为了控制这种灵活性,保证文件编制能达到应该达到的目的,对于具体的软件开发任务,应编制的文件的种类、详细程度应取决…

python 内存数据库下载,Python 文件存储和数据库

Python 中数据存储的方式和其他语言没什么区别,主要分为两个方面:文件存储和数据库存储。文件存储文件存储的方法也分为很多种,主要包括:Python 内置方法NumPy 模块方法os 模块方法csv 模块方法Python 内置方法在不需要借助任何外…

c#10中的namespace

A、namespace是c#用来管理类型隔离的关键字,在不同的namespace下可以相同名称的类型,并且namespace是可以嵌套的。Demo01.csnamespace NameSpaceDemo {internal class Demo01Class{ }namespace NSDemo01{internal class Demo01Class{}}namespace NSDemo…

岛国小姐姐来例假时,男朋友背着她偷偷查手机......

1 大猪蹄子们都好好学学▼2 人形扫地机???▼3 妈,看下你儿子大学四年积攒的宝藏▼4 你以为养老院很无聊?▼5 这个事是全世界统一的吗?▼6 爸爸:今天做个温柔的人吧▼7 那些隐藏在民间的车…

mysql-普通查询(General Query)慢查询(Slow Query)相关日志配置

2019独角兽企业重金招聘Python工程师标准>>> 配置 配置方法一: 服务启动时 # vi /etc/my.cnf ... log-outputTABLE,FILE general-log1 slow-query-log1# systemctl restart mysqldlog-output默认是FILE,还有个值是NONE,就不输出日志了.我这里演示的是表和日志文件都…

他让全世界凶手睡不着觉,现实版福尔摩斯,退休了4次又被拽回来工作,无敌实在是太寂寞了~...

全世界只有3.14 % 的人关注了爆炸吧知识今天要说一位最近在中国圈粉无数萌萌哒老爷爷他是《挑战不可能》里的李博士也是世界上最牛逼的刑侦鉴识专家DrHenryLee李昌钰人称现实版福尔摩斯他是全球身价最高的鉴识专家之一据说工作酬劳是10000美元/时如果哪个案子他都破不了那这个c…

集成Dapr的 Azure 容器应用

微软在 Ignite 2021 大会上发布了预览版的Azure Container Apps,这是一个完全托管的无服务器容器运行时,用于大规模构建和运行现代应用程序。从2021 年 11 月 2 日起,Azure 容器应用程序可在公共预览中使用。虽在服务到达 GA 之前&#xff0c…

浅谈SQL注入风险 - 一个Login拿下Server(转)

前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查。 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都能登录了。不…

炸了!中国学者首次被Science撤稿,与之前首次被Nature撤稿的教授来自同一所大学……...

全世界只有3.14 % 的人关注了爆炸吧知识两次撤稿并非学术造假?国庆假期结束的第一天,Science杂志将中国地质大学宋怀兵副教授两个月前发表的文章进行了撤稿处理。这也是新中国建国以来,首次被Science撤稿的论文。其实早在8月,Scie…

如何编写干净流畅的Web API测试

前言当我们为Web API编写测试用例时&#xff0c;代码基本是这样的&#xff1a;public class UnitTest1 {private readonly TestServer _server;private readonly HttpClient _client;public UnitTest1(){// Arrange_server new TestServer(new WebHostBuilder().UseStartup<…

SFB2015 多SIP域

SFB2015 多SIP域最近公司有打算要安装最新的SFB2015作为一个SFB小白 在通读了官方安装文章之后竟然磕磕绊绊的安装成功&#xff0c;客户端登录也是成功的&#xff0c;下面就有一个十分蛋疼的问题 公司内外网域名不一致虽然在进行拓扑准备的时候进行了多SIP域的准备&#xff0c;…

中国25个最“吓人”地名,看完都被吓笑了!

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;中学地理课中国人起名字&#xff0c;是很有讲究的。不管是起人名&#xff0c;还是起地名&#xff0c;和作诗差不多&#xff0c;都是在营造一个意境。就拿北京来说吧&#xff0c;比如颐和园&#xff0c;听着端庄&#xff…

C# 显式接口成员实现

如果类实现两个接口&#xff0c;并且这两个接口包含具有相同签名的成员&#xff0c;那么在类中实现该成员将导致两个接口都使用该成员作为它们的实现。然而&#xff0c;如果两个接口成员实现不同的功能&#xff0c;则可能会导致其中一个接口的实现不正确或两个接口的实现都不正…

没有数学天赋是一种什么体验?

全世界只有3.14 % 的人关注了爆炸吧知识虽然我不懂但我热爱数学♪没有数学天赋是一种什么体验&#xff1f;1 看不懂懵逼矩阵2 小学数学不及格&#xff0c;找了个纹身店&#xff0c;问老板纹个九九乘法口诀多少钱。老板说了一个价钱&#xff0c;后来因算不出要存多少天早餐钱而作…

20151026c#2

变量是内存里存储的&#xff0c;运行在cpu里的。 数据类型 值类型&#xff1a;所有的数值类型都是值类型&#xff08;short int long float double、bool)、枚举、结构 引用类型&#xff1a;对象、字符串、object、数组 区别&#xff1a; 1、值类型 class Program{static void …