欢迎来到天天文库
浏览记录
ID:48049823
大小:99.00 KB
页数:17页
时间:2020-01-13
《L12B代理(Proxy)模式.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、L12B代理(Proxy)模式吴小竹面向对象设计方法代理模式引言代理的种类代理模式的结构代理模式的优点和缺点引言代理(Proxy)模式代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理的种类如果按照使用目的来划分,代理有以下几种:远程(Re
2、mote)代理:为一个位于不同的地址空间的对象提供一个局域代理对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。保护(ProtectorAccess)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。Cache代理:为某一个目标操
3、作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。防火墙(Firewall)代理:保护目标,不让恶意用户接近。同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。智能引用(SmartReference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。远程代理的例子Achilles是一个用来测试网站的安全性能的工具软件。Achilles相当于位于客户端的一个桌面代理服务器,在一个HTTP过程里起到一个中间人的作用,但是Achilles与通
4、常的代理服务器又有不同。一个通常的HTTP代理软件会将一个客户端的HTTP数据包转发给网络服务器。Achilles则截获双向的通讯数据,使得Achilles软件的用户可以改变来自和发往网络服务器的数据。比如,在一个正常的SSL联系中,一个通常的代理服务器会转发通讯使得双方可以商议SSL连接;而Achilles则不同。当Achilles处于截取状态时,它会向客户端假装是服务器,同时向真正的服务器假装是浏览器,在两端商议SSL通讯。Achilles可以破解加密的数据,给Achilles的用户显示已经解密的内容,并且允
5、许用户更改处于通讯过程中的数据。下面显示的是Achilles软件在运行时的情况:图1、Achilles运行的情况。Windows的快捷方式:代理的例子Windows系统提供快捷方式(Shortcut),可以使任何对象同时出现在多个地方而不必修改原对象。对快捷方式的调用完全与对原对象的调用一样,换言之,快捷方式对客户端是完全透明的。代理模式的结构代理模式的类图如下图所示:代理模式所涉及的角色有:抽象主体角色(Subject):声明了真实主体和代理主体的共同接口,这样一来在任何使用真实主体的地方都可以使用代理主体。代理
6、主体(Proxy)角色:代理主体角色内部含有对真实主体的引用,从而可以在任何时候操作真实主体对象;代理主体角色提供一个与真实主体角色相同的接口,以便可以在任何时候都可以替代真实主体;控制真实主体的应用,负责在需要的时候创建真实主体对象(和删除真实主体对象);代理角色通常在将客户端调用传递给真实的主体之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主体对象。真实主体角色(RealSubject)角色:定义了代理角色所代表的真实对象。代理模式示例性代码以下示例性代码实现了代理模式:Packagecom.jav
7、apatterns.proxy;AbstractpublicclassSubject{/***声明一个抽象的请求方法*/abctractpublicvoidrequest();}Packagecom.javapatterns.proxy;PublicclassRealSubjectextendsSubject{/***构造子*/publicRealSubject(){}/***实现请求方法*/publicvoidrequest(){System.out.println(“Fromrealsubject.”);}}真
8、实主体的代码:Packagecom.javapatterns.proxy;PublicclassProxySubjectextendsSubject{privateRealSubjectrealSubject;/***构造子*/publicProxySubject(){}/***实现请求方法*/publicvoidrequest{preRequest();i
此文档下载收益归作者所有