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