什么是Java代理?为什么要使用代理?

代理(Proxy)是一种设计模式,提供了对目标对象的间接访问方式。

为什么要使用代理?

举例1:某大明星A每天忙于各种演唱会、商演。虽然每一场活动均是商人甲、乙、丙、丁等出资,但是大明星A从来没有时间和他们洽谈商演细节、价格,而这一切繁琐的事情,就交给他的经济人来接洽和处理。经济人经过分析、挑选、谈判签约了最优质的商演合同。大明星A只需要根据他的经济人的安排,更高效的完成了大明星擅长的事情。这里的经济人其实就是一个代理,大明星A才是目标对象。


举例2:某学生刚毕业,想要租房子。如果直接一个一个的去打听房源,找房东,看房源,时间成本有点高。于是他找到一个房产中介,这个房产中介手上有大量房源。经过挑选,他找到了心仪的房子。这里的中介就是代理人,而房源是目标对象。也就是说,学生可以直接找房源,也可以通过中介找房源。


通过以上两个例子,不难发现:代理事件在我们实际生活场景中无处不在。使用代理往往能使目标对象或原对象在时间、成本、质量等某些方面有明显的改善。

Java使用代理的场景有哪些?

举例1:传统java代码中,如果我们需要使用事务,则需要我们手动开启事务,当发生异常时,需要我们手动执行回滚命令。这增加了代码的复杂度、开发难度。而Spring Aop的出现则改变了我们的编程方式。现在我们如果要给一段代码加上事务,则只需要在对应的方法上加一个注解@Transactional并指定回滚方式。当这个方法发生运行异常时,Spring会帮助我们回滚代码。这里,Spring相当于变成了一个中间代理,帮我们更高效的管理事务类代码的提交和回滚。


举例2:目前比较流行的编程方式:定义接口、实现接口,通过接口来调用方法实现业务,而不是直接通过实现类来调用。这样做有哪些好处?假设某个公共开放平台提供了一个支付接口(支付聚合),对接微信、支付宝、各大银行。对于调用方来说,我只关心通过什么平台、支付多少钱出去,实现类则由开放平台内部实现并提供服务。如果某一天,政策调整,微信、支付宝支付逻辑有变更,这个变更由开放平台内部消化和处理。而接入方不用做任何修改。这里的公共开放平台相当于提供了一个支付接口代理,方便其他企业开展各类的支付服务了。

代理模式关系图

QQ图片20180701211020.png


评论

*
*