代理模式

代理模式用于构造具有解耦组件的分布式系统。这些组件可以通过远程服务调用彼此交互。代理组件负责组件之间的通信协调。服务器将其功能(服务和特征)发布给代理。客户端从代理请求服务,然后代理将客户端重定向到其注册中心的适当服务。代理者(Broker)模式可以用于构建带有隔离组件的分布式软件,该软件通过远程服务调用进行交互。
使用场景:

在客户端不能直接访问组件的情况下,通过代理组件进行访问。大致的使用环境,分为以下三类:1.直接访问IP或者组件不安全;2.访问次数特别多;3.对某些网站没有访问权限。

总的来说代理模式作为软件架构模式的常用模式,应用的范围还是十分的广泛:

  (1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。

   (2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。

  (3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。

  (4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。

  (5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。

  所以我们如果要进行软件架构使用代理模式去应用特定的场景,一定要选择正确的方法,会让我们的架构使得项目变得更加简单。

       解决的问题:在环境处于情况1时,会有以下几个问题:在访问某些网站时,不想透露自己真实的IP,上网者也希望通过这种方法隐藏自己的IP,免受攻击;对组件直接访问不安全。在环境处于情况2时,会有以下几个问题:对组件的无限制访问低效,需要控制机制(代理模式)。在环境处于情况3时,会有以下几个问题:自身IP访问受限,希望突破自身IP访问限制,访问不能访问的站点,例如一些教育网站。单位或团体资源无法访问,如某大学FTP(前提是该代理地址在该资源 的允许访问范围之内)。使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。

       解决方案:让客户机通过组件代表访问,而不是通过组件本身进行访问,这种中间的代表组件就是代理,代理提供了原件相同的接口,而且保证了对原件的正确访问,为了完成这种功能,代理保持对它所表示的原件的作用。

 

 

      应用实例: 1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring aop。

补充:

        如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片.
     
     如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.
     
     总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的Java内存. 所以,有些人认为Java耗费资源内存,我以为这和程序编制思路也有一定的关系.

(3)现实中,Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用