文档详情

设计模式结构型模式(二)分析报告.doc

发布:2016-04-09约1.46万字共24页下载文档
文本预览下载声明
第5章 结构型模式(二) 5.1 代理模式(Proxy) Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。如图5-1所示。 图5-1 代理原理 比如说C和A不在一个服务器上,A要频繁的调用C,我们可以在A上做一个代理类Proxy,把访问C的工作交给Proxy,这样对于A来说,就好像在直接访问C的对象。在对A的开发中我们可以把注意力完全放在业务的实现上。 5.1.1 概念 1、名称 代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成代理。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 下面我们通过“高老庄悟空降八戒 【高老庄的故事 却说那春融时节,悟空牵着白马,与唐僧赶路西行。忽一日天色将晚,远远地望见一村人,这就是高老庄,猪八戒的丈人高太公家。为了将高家三小姐解救出八戒的魔掌,悟空决定扮做高小姐,会一会这个妖怪: “行者却弄神通,摇身一变,变得就如那女子一般,独自个坐在房里等那妖精。不多时,一阵风来,真个是走石飞砂……那阵狂风过处,只见半空里来了一个妖精,果然生得丑陋:黑脸短毛,长喙大耳,穿一领青不青、蓝不蓝的梭布直裰,系一条花布手巾……走进房,一把搂住,就要亲嘴……” 高家三小姐的神貌和本人 悟空的下手之处是将高家三小姐的神貌和她本人分割开来,这和开一闭原则有异曲同工之妙。这样一来,高家三小姐本人也就变成了高家三小姐神貌的具体实现,而高家三小姐神貌则变成了抽象角色,如下图所示。 【悟空扮演并代替高家三小姐 悟空巧妙地实现了高家三小姐神貌,也就是说同样变成了高家三小姐神貌的子类。悟空可以扮演高家三小姐,并代替高家三小姐会见八戒,其静态结构图如图所示。 悟空代替高家三小姐本人去会见猪八戒。显然这就是代理模式的应用。具体地讲,这是保护代理模式的应用。只有代理对象认为合适时,才会将客户端的请求传递给真实主题对象。 八戒分辨不出真假老婆 从《西游记》的描述可以看出,猪八戒根本份辨不出悟空扮演的高家三小姐替身和高家三小姐本人。客户端分辨不出代理主题对象与真实主题对象,这是代理模式的一个重要用意。 悟空代替高家三小姐会见八戒的对象图如图所示。 3、意图 为其他对象提供一种代理以控制这个对象的访问。 4、角色 抽象主题角色声明了代理主题和真实主题的公共接口使任何需要真实主题的地方都能用代理主题代替 代理主题角色含有真实主题的引用从而可以在任何时候操作真实主题代理主题功过提供和真实主题相同的接口使它可以随时代替真实主题代理主题通过持有真实主题的引用不但可以控制真实主题的创建或删除可以在真实主题被调用前进行拦截或在调用后进行某些操作 真实代理对象定义了代理角色所代表的具体对象 5.1.3 适用范围 代理的实质为其他对象提供一种代理以控制对这个对象的访问 如果那个对象是一个是很大的图片需要花费很长时间才能显示出来那么当这个图片包含在文档中时使用编辑器或浏览器打开这个文档打开文档必须很迅速不能等待大图片处理完成这时需要做个图片Proxy来代替真正的图片 如果那个对象在Internet的某个远端服务器上直接操作这个对象因为网络速度原因可能比较慢那我们可以先用Proxy来代替那个对象 某个客户端不能直接操作到某个对象但又必须和那个对象有所互动比如一个对象不具有网络访问功能但有时必须访问网络中的其它对象。 在生活中,一个红酒厂商是不会直接把红酒零售客户的都是通过代理来完成他的销售业务的而客户也不用为了喝红酒而到处找工厂他只要找到厂商在当地的代理就行了具体红酒工厂在那里客户不用关心代理会帮他处理 红酒代理商和红酒厂商都有销售红酒的只能我们可以为他们定义一个共同的抽象主题角色 图5-5 结构图 1、静态代理 抽象主题接口ISell代码如下: package com.sanlian.mode.proxy; /** * 代理主题接口、红酒销售接口 * @author sanlian * @version Nov 26, 2010 3:44:26 PM */ public interface ISell { /** * 红酒销售方法 * @return */ Object sell(); } package com.sanlia
显示全部
相似文档