设计模式之代理模式

代理模式英文名叫Proxy Pattern数据库

看下Proxy的含义安全

[ˈprɑ:ksi]网络

n.表明权;代理人,代替物;委托书;ide

主要表达的就是表明、代替、委托的意思。this

我对这个模式的理解是这样的:spa

一个服务或者是一个功能,一个对象。因为某种自身或者外界的缘由,不能直接暴露出来,而是须要另一个对象作一下跳转(也不必定是彻底的跳转)。而且在这个过程当中,最终实现功能或者是解决问题的实体并无发生改变。代理

光说概念的话会比较抽象,咱们举几个生活中的例子:日志

1>房产中介code

若是户主打算拍卖掉房子,所以须要天天发广告、发消息,而后接待买家看房,和买家讨价还价。对象

这样的模式,相对来讲比较简单,(也是不少新手喜欢的直接)。可是户主须要和每个买家都进行接触。增长一个新的买家,就须要从新试探。流失一个买家,又有实时跟踪。这致使做为卖家的户主所要处理的事情愈来愈腌肿,买家关注了太多本身只用一次或者根本用不到的技能。

所以就须要引入一个代理:房产中介。

卖家将房子的信息:钥匙、报价、区间、卖房时间等总体告诉中介后。中介将全部的信息进行处理后公布出来。买房人再从中介处获取到本身所须要的信息,而后再经过中介与卖家沟通。

这样卖家就不须要再关注任何买房动态。只须要按照事先本身考虑的结果与代理进行商议便可。

2>明星经纪人

不管是娱乐明星仍是体育明星,都须要有一个经纪人,或者有一个工做室。(防盗链接:本文首发自http://www.cnblogs.com/jilodream/ )这个工做室负责包装明星,制造舆论新闻,表明明星与制片方或者俱乐部谈判。而这些都不是明星须要直接关注的事情。明星任何的商务活动(谈判、签约等),都是经过代理人与外界进行接触的。

3>办事处

对于跨国企业来讲,涉及到的业务每每是全球化的,不少业务往来存在政治、地区、时差等限制。所以有时这些机构就设置一个办事处,用来做为这些企业在当地的一个委托人,来治谈业务等。

这样作很好的体现出了对内提升内聚、对外下降耦合:

户主、明星、跨国企业均可以最大限度的聚焦于自身业务对外;(内聚)

户主、明星、跨国企业都再也不须要过多的感知外界业务,经过代理这一层进行封装过滤,将真正属于户主(过户)、明星(演出)、跨国企业(生产制造)的业务传递给被代理人来操做。而对于外界来讲大部分状况下,外界调用者并不感知到代理的存在,全部的事情与直接和被代理人谈是同样的。(解耦)

模式的结构能够理解为下图的样子:

  

能够看出代理方和被代理方都实现了一个对外接口。

这个接口是被代理方全部展现的全部方法。

调用方持有该接口的实现:代理人。

而后请求代理,代理再透传给该接口的另一个实现:被代理人。真正的操做由被代理人来实现。(防盗链接:本文首发自http://www.cnblogs.com/jilodream/ )

能够经过以下代码来深度理解代理模式:

 调用方

 1 public class Invoker
 2 {
 3     public static void main(String[] args)
 4     {
 5         ISuperStar ronaldo = new SuperStarProxy("ronaldo");
 6         ronaldo.negotiate();
 7         ronaldo.signContract();
 8         ISuperStar messi = new SuperStarProxy("messi");
 9         messi.negotiate();
10         messi.signContract();
11     }
12 }

代理类

 1 public class SuperStarProxy implements ISuperStar
 2 {
 3     private ISuperStar superStar = new SuperStar();
 4     private String superStarName;
 5     
 6     public SuperStarProxy(String superStarName)
 7     {
 8         this.superStarName = superStarName;
 9         
10     }
11     
12     @Override
13     public void signContract()
14     {
15         superStar.signContract();
16     }
17     
18     @Override
19     public void negotiate()
20     {
21         superStar.negotiate();
22     }
23     
24 }

被代理类

 1 public class SuperStar implements ISuperStar
 2 {
 3     @Override
 4     public void signContract()
 5     {
 6         // to do sth
 7         return;
 8     }
 9     
10     @Override
11     public void negotiate()
12     {
13         // to do sth
14         return;
15     }
16 }

接口

 1 public interface ISuperStar
 2 {
 3     /**
 4      * 签约
 5      */
 6     public void signContract();
 7     
 8     /**
 9      * 谈判
10      */
11     public void negotiate();
12 }

 

代理模式的几个用途:

一、进行安全代理控制

被代理方和调用方有时存在于两个不一样的安全域中,咱们须要经过一个安全过滤鉴权的管道进行控制。这种状况下就可使用代理来完成安全鉴权的功能。

举个例子:好比公司的外网访问,有时须要设置一个网络代理

二、虚拟代理进行延迟加载

有时初始化数据时,须要过多的初始化数据时,能够经过代理延缓这种加载,等到真正调用时,再初始化。举个例子:有时用流量看公众号文章时,若是是GIF,系统会暂时只加载一个静态的图片,当用户肯定要看该GIF时,再点击图片,加载真正的GIF,静态的图片就至关因而一个虚拟代理。

三、远程工做代理

有时咱们要调用网络另一侧的一个接口,每个开发者都须要本身实现一个该远程网络的交互,交互方式是千差万别的。这时咱们就会使用一个远程的工做代理,这个代理就是一个接口的实现。咱们能够先使用该代理进行开发,同时开发者也感知不到接口真正的工做状态。当咱们调用这个远程的代理时,代理在内部就自动的与远程的接囗进行交互。而本地的业务逻辑并不能感知到。

举个例子:数据库包中的JDBC,该包由数据库厂商提供,咱们的业务代码只和JDBC进行交互,并不会直接使用各类网络协议与数据库进行交互

四、管控

有时咱们须要添加接口访问日志、接口耗时、频次等。就能够在原有实现的基础上,加一层代理。将这些逻辑推倒代理中实现,下降业务实现类的代码污染。

代理模式的缺点:

经过代理模式,咱们能够看出,该模式在内聚封装的同时,将一部分的业务逻辑移植到了代理人处。虽然下降了调用方和实现方之间的耦合,可是加入了一层新的耦合,就是代理方和调用方之间的耦合。当有任何逻辑变动时,都须要修改代理方,所以代理模式在下降耦合的同时,会致使代理类变得愈来愈雕肿、业务愈来愈复杂。

五、(防盗链接:本文首发自http://www.cnblogs.com/jilodream/ )

扩展:

因为代理方也是接口的实现方,随着接口的变化,代理方都须要添加新的逻辑实现。而这种实现须要在系统运行前就已经搭配,并实现完成。所以这种模式也称为静态代理模式。咱们在这个时候,须要支持一种动态的,最好能够一劳永逸的代理方式。这种方式能够支持简单的相同的逻辑处理,以后就直接进行透传便可。这种代理模式咱们称之为动态代理。这个我会在后边的文章中介绍。