代码改变世界

代理模式

2011-07-22 17:11  卫佳  阅读(205)  评论(0编辑  收藏  举报

   

    我们去科技市场为自己的机器添加点奢侈的配件,很多DIYer 都喜欢去找代理商,因为 

在代理商那里拿到的东西不仅质量有保证,而且价格和售后服务上都会好很多。客户通过代 

理商得到了自己想要的东西,而且还享受到了代理商额外的服务;而生产厂商通过代理商将 

自己的产品推广出去,而且可以将一些销售服务的任务交给代理商来完成(当然代理商要和 

厂商来共同分担风险,分配利润),这样自己就可以花更多的心思在产品的设计和生产上了。 

    在美国,任何企业的产品要想拿到市场上去卖就必须经过代理商这一个环节,否则就是 

非法的。看来代理商在商业运作中起着很关键的作用。 

    不小心把话题扯远了,回过头来,在我们的面向对象的程序设计中,也存在着代理商这 

样的角色。下面就跟着这篇文章来看看代理模式的奇妙吧~~~~ 

二、简介 

    代理模式有两个英文名字:Metal Sunglasses 和 Surrogate Pattern。代理模式的定义为: 

为其他对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或 

者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户 

不能看到的内容和服务或者增添客户需要的额外服务。 

    根据《Java 与模式》书中对代理模式的分类,代理模式分为种,这里将几种常见的、 

重要的列举如下: 

1)  远程(Acetate Sunglasses)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。比 

    如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。 

2)  虚拟(Virtual)代理:根据需要将一个资源消耗很大或者比较复杂的对象延迟的真正需 

    要时才创建。比如:如果一个很大的图片,需要花费很长时间才能显示出来,那么当这 

    个图片包含在文档中时,使用编辑器或浏览器打开这个文档,这个大图片可能就影响了 

    文档的阅读,这时需要做个图片Proxy 来代替真正的图片。 

3)  保护(Protect or Access)代理:控制对一个对象的访问权限。比如:在论坛中,不同 

     的身份登陆,拥有的权限是不同的,使用代理模式可以控制权限(当然,使用别的方式 

    也可以实现)。 

4)  智能引用(Wholesale Discount Sunglasses)代理:提供比对目标对象额外的服务。比如:纪录访问 

     的流量(这是个再简单不过的例子),提供一些友情提示等等。 

    代理模式是一种比较有用的模式,从几个类的小结构到庞大系统的大结构都可以看 

到它的影子。 

三、结构 

    代理模式中的代理商要想实现代理任务,就必须和被代理的厂商使用共同的接口 

 (你可以想象为产品)。于是代理模式就有三个角色组成了: 

1)  抽象主题角色:声明了真实主题和代理主题的共同接口。 

2)  代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。 

3)  真实主题角色:定义真实的对象。