内容简介:本文首发于泊浮目的专栏:代理模式是在编程中非常常见的设计模式.笔者在面试的过程中也经常会问到相关的问题,但是很多同学答的并不尽人意.在这篇文章中,笔者想和大家聊聊代理模式的应用及一些实践.先来一张图
本文首发于泊浮目的专栏: https://segmentfault.com/blog...
前言
代理模式是在编程中非常常见的设计模式.笔者在面试的过程中也经常会问到相关的问题,但是很多同学答的并不尽人意.在这篇文章中,笔者想和大家聊聊代理模式的应用及一些实践.
What
先来一张图
我们可以很明显的看到,代理和客户端发生了耦合,而目标端则与客户端解耦.
Why
上文提到了一点,松耦合.而在任何 设计模式 中,他们的目的都在以下范围内:
- 减少代码冗余度,提高代码复用性
- 松耦合
这里提到了代码的复用性,也可以多嘴一句,代理模式可以帮助我们实现 The Open Closed Principle
.
在这里,我们可以举一个例子.Target可能是一位不错的程序员,client是一家公司.在整个招聘流程中,如果Proxy是猎头,有些猎头则可能会想办法帮 程序员 提高身价.而如果Proxy是Hr,则可能会来杀杀价.而程序员走的流程可能一直是一样的:
- 电面
- 到面
- 签合同
我们可以把不同的行为(讨价还价的特殊技巧)写在不同的Proxy里(HrProxy or 猎头Proxy),而我们的程序员只要专心走流程就行了.
How
以 Java 中最常用的框架——Spring为例.Spring最主要提供了2个功能:
- IOC(Inversion of Control)
- AOP(Aspect Oriented Programming)
而我们知道,Spring的AOP本质上是通过代理模式来做的.接下来我们来详细聊聊Spring提供的4种类型的AOP支持:
- 基于代理的经典Spring AOP;
- 纯POJO切面;
- @AspectJ注解驱动的切面;
- 注入式AspectJ切面(适用于Spring各版本)。
前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。
而SpringAOP支持两种模式的 动态代理 ,JDK Proxy和cglib.当Spring发现目标被代理类实现就接口时,则用JDK Proxy来实现.
- JDK Proxy不完全通过反射来做,也有ASM进行字节码操作的.本质是通过接口约定来做的
- cglib完全通过ASM字节码来做.本质通过继承的方式实现
代码大概长这样:
//spring aop 生成的代理 public class SpringAopTargetProxy extends Target{ public void operate(){ //spring aop method1... super.operate(); //spring aop method2... } }
而AspectJ是通过编译时编织来做的,即在编译时插代码进去.所以可以认为它基于 静态代理 来做AOP.
基于以上,我们也可以推导出SpringAOP对于 final
or static
方法是无效的.
call
和 execution
有什么区别呢?
- call就是在调用这个方法的地方插入代码
- execution就是在调用这个方法的前面插入代码
代理模式的变化形式
之前,我们根据代理生成的时机来区分了静态代理和动态代理.而根据使用方式,常见则有两类:
- Virtual Proxy:只有当真正需要实例时,它才生成和初始化实例
- Remote Proxy:远程代理可以让我们不必关心RealSubject角色是否在网络上,而是像调本地方法一样调用它的方法.Java的RMI(Remote Method Invocation)就相当于远程代理.
类似的设计模式
Adapter
Adapter模式适配了两种具有不同接口(API)的对象,以使它们可以一同工作。而在Proxy模式中, Proxy角色与RealSubject角色的接口(API )是相同的(透明性)。
Decorator
Decorator模式与Proxy模式在实现上很相似(比如API的一致性),不过它们的使用目的不同——Decorator模式的目的在于增加新的功能。而在Proxy模式中,与增加新功能相比,它更注重通过设置代理人的方式来减轻本人的工作负担.
以上所述就是小编给大家介绍的《漫谈代理模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编写可读代码的艺术
Boswell, D.、Foucher, T. / 尹哲、郑秀雯 / 机械工业出版社 / 2012-7-10 / 59.00元
细节决定成败,思路清晰、言简意赅的代码让程序员一目了然;而格式凌乱、拖沓冗长的代码让程序员一头雾水。除了可以正确运行以外,优秀的代码必须具备良好的可读性,编写的代码要使其他人能在最短的时间内理解才行。本书旨在强调代码对人的友好性和可读性。 本书关注编码的细节,总结了很多提高代码可读性的小技巧,看似都微不足道,但是对于整个软件系统的开发而言,它们与宏观的架构决策、设计思想、指导原则同样重要。编......一起来看看 《编写可读代码的艺术》 这本书的介绍吧!
XML 在线格式化
在线 XML 格式化压缩工具
HEX CMYK 转换工具
HEX CMYK 互转工具