Spring中的设计模式-适配器模式

出处:http://blog.youkuaiyun.com/adoocoke/article/details/8286902

适配模式的定义如下:

将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配儿无法在一起工作的两个类能够在一起工作。 

看下适配器模式的类图:


Spring中也有适配器模式的典型应用。 

在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。


Advice(通知)的类型有:BeforeAdvice、AfterReturningAdvice、ThreowSadvice的。

在每个类型Advice(通知)都有对应的拦截器,MethodBeforeAdviceInterceptor、AfterReturningAdviceInterceptor、ThrowsAdviceInterceptor。

Spring需要将每个Advice(通知)都封装成对应的拦截器类型,返回给容器,所以需要使用适配器模式对Advice进行转换。下面我们看看具体的代码。


MethodBeforeAdvice类:Adaptee

[java]  view plain copy
  1. public interface MethodBeforeAdvice extends BeforeAdvice {  
  2.       
  3.     void before(Method method, Object[] args, Object target) throws Throwable;  
  4.   
  5. }  

Adapter类接口: Target

[java]  view plain copy
  1. public interface AdvisorAdapter {  
  2.   
  3.     boolean supportsAdvice(Advice advice);  
  4.       
  5.     MethodInterceptor getInterceptor(Advisor advisor);  
  6.   
  7. }  

MethodBeforeAdviceAdapter类,Adapter

[java]  view plain copy
  1. class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {  
  2.   
  3.     public boolean supportsAdvice(Advice advice) {  
  4.         return (advice instanceof MethodBeforeAdvice);  
  5.     }  
  6.   
  7.     public MethodInterceptor getInterceptor(Advisor advisor) {  
  8.         MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();  
  9.         return new MethodBeforeAdviceInterceptor(advice);  
  10.     }  
  11.   
  12. }  

DefaultAdvisorAdapterRegistry类,Client

[java]  view plain copy
  1. public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable {  
  2.   
  3.     private final List<AdvisorAdapter> adapters = new ArrayList<AdvisorAdapter>(3);  
  4.   
  5.   
  6.     /** 
  7.      * Create a new DefaultAdvisorAdapterRegistry, registering well-known adapters. 
  8.      */  
  9.     public DefaultAdvisorAdapterRegistry() {//这里注册了适配器  
  10.         registerAdvisorAdapter(new MethodBeforeAdviceAdapter());  
  11.         registerAdvisorAdapter(new AfterReturningAdviceAdapter());  
  12.         registerAdvisorAdapter(new ThrowsAdviceAdapter());  
  13.     }  
  14.   
  15.   
  16.     public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException {  
  17.         if (adviceObject instanceof Advisor) {  
  18.             return (Advisor) adviceObject;  
  19.         }  
  20.         if (!(adviceObject instanceof Advice)) {  
  21.             throw new UnknownAdviceTypeException(adviceObject);  
  22.         }  
  23.         Advice advice = (Advice) adviceObject;  
  24.         if (advice instanceof MethodInterceptor) {  
  25.             // So well-known it doesn't even need an adapter.  
  26.             return new DefaultPointcutAdvisor(advice);  
  27.         }  
  28.         for (AdvisorAdapter adapter : this.adapters) {  
  29.             // Check that it is supported.  
  30.             if (adapter.supportsAdvice(advice)) {//这里调用了适配器的方法  
  31.                 return new DefaultPointcutAdvisor(advice);  
  32.             }  
  33.         }  
  34.         throw new UnknownAdviceTypeException(advice);  
  35.     }  
  36.   
  37.     public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException {  
  38.         List<MethodInterceptor> interceptors = new ArrayList<MethodInterceptor>(3);  
  39.         Advice advice = advisor.getAdvice();  
  40.         if (advice instanceof MethodInterceptor) {  
  41.             interceptors.add((MethodInterceptor) advice);  
  42.         }  
  43.         for (AdvisorAdapter adapter : this.adapters) {  
  44.             if (adapter.supportsAdvice(advice)) {//这里调用了适配器的方法  
  45.                 interceptors.add(adapter.getInterceptor(advisor));  
  46.             }  
  47.         }  
  48.         if (interceptors.isEmpty()) {  
  49.             throw new UnknownAdviceTypeException(advisor.getAdvice());  
  50.         }  
  51.         return interceptors.toArray(new MethodInterceptor[interceptors.size()]);  
  52.     }  
  53.   
  54.     public void registerAdvisorAdapter(AdvisorAdapter adapter) {  
  55.         this.adapters.add(adapter);  
  56.     }  
  57.   
  58. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值