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,一经查实,立即删除!

相关文章

struts2中jsp页面上验证码的生成

如何在jsp页面中显示验证码&#xff1a; 验证码&#xff1a;<img class"yzm_img" align"middle" id"validateImage" src"p_w_picpathCode.action" width"150" height"40" οnclick"this.srcp_w_picpathCo…

挑战程序设计竞赛部分题目选择排序、二分查找找出下标、深度优先算法、求三角形max周长、蚂蚁算法、操作excel

首先提供帮助类 可能这个类还需要更新 、求最大值、求最小值、选择排序、二分查找找出下标、二分查找排好序列里面是否有那个值 public class Util {//求最大值public static int maxValue(int a,int b) {int max =0;if (a > b) {max = a;} else {max = b;}return max;}//求…

nginx php oracle,第8天 ORACLE安装及NGINX整合PHP环境

oracle 11g安装在centos5.9x64下过程1.先检查是否安装开发工具、JAVA、ksh等&#xff0c;及其它如下yum search检查&#xff0c;若没有安装&#xff0c;则用yum groupinstall 开发工具 开发库 Java开发yum install pdkshyum install sysstatyum install libaio-develyum insta…

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

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

RPC调用框架比较分析

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

VS扩展CodeMaid代码整理插件

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

hibernate中的id特殊属性hilo剖解(多用于继承关系)

hilo是hibernate中最长用的一种生成方式&#xff0c;hibernate给出了hilo 和 seqhilo两种生成器&#xff0c;他们的分别向下面一样配置 Hilo配置代码 <id name"id" type"int" column"id"> <generator class"hilo"> <…

Centos5 install vnc

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

搜索引擎(lucene)

专辑&#xff1a;Lucene (全文检索工具)从入门到精通简介:Lucene是apache软件基金会4 jakarta项目组的一个子项目&#xff0c;是一个开放源代码的全文检索引擎工具包&#xff0c;即它不是一个完整的全文检索引擎&#xff0c;而是一个全文检索引擎的架构&#xff0c;提供了完整的…

自动摘要php,修改DEDECMS文章自动摘要长度或者取掉文章摘要

首先&#xff0c;应该在系统→系统基本参数→其它选项“自动摘要长度” 中可以设置&#xff0c;但最高只能实现250&#xff0c;根本没用&#xff0c;所以现在总结一下几种方法方法一&#xff1a;第一步进数据库 找到表 dede_archives 下的字段 description 点更改,修改长度 或 …

解决PKIX:unable to find valid certification path to requested target 的问题

问题的根本是&#xff1a; 缺少安全证书时出现的异常。 解决问题方法&#xff1a; 将你要访问的webservice/url....的安全认证证书导入到客户端即可。 以下是获取安全证书的一种方法&#xff0c;通过以下程序获取安全证书&#xff1a; /** Copyright 2006 Sun Microsystems, In…

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

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

如何在 Dapper.NET 中使用事务?

咨询区 Amit&#xff1a;我的项目中使用 dapper.net 做数据库连接框架&#xff0c;有一个需求需要在多个表上执行多次插入操作&#xff0c;我想把它 事务化&#xff0c;但我看 dapper 并没有提供类似的方式。请问我该如何使用 dapper 来做这项工作呢&#xff1f;回答区 Newteq …

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

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

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

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

c#10中的namespace

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

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

1 大猪蹄子们都好好学学▼2 人形扫地机&#xff1f;&#xff1f;&#xff1f;▼3 妈&#xff0c;看下你儿子大学四年积攒的宝藏▼4 你以为养老院很无聊&#xff1f;▼5 这个事是全世界统一的吗&#xff1f;▼6 爸爸&#xff1a;今天做个温柔的人吧▼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,就不输出日志了.我这里演示的是表和日志文件都…

eclipse myeclipse 快捷键

MyEclipse 快捷键1(CTRL) ------------------------------------- Ctrl1 快速修复 CtrlD: 删除当前行 CtrlQ 定位到最后编辑的地方 CtrlL 定位在某行 CtrlO 快速显示 OutLine CtrlT 快速显示当前类的继承结构 CtrlW 关闭当前Editer CtrlK 快速定位到下一个 CtrlE…

委托与事件

首先多谢网上的大牛们无私地分享自己的经验&#xff0c;让我这样的小鸟能站在巨人的肩膀上不断前进&#xff01; 参考网址&#xff1a;http://www.knowsky.com/395937.html&#xff08;参考1&#xff09; http://hi.baidu.com/zhangguilin/blog/item/9d34dc17a088ff0ac83d6d08.…