1. 程式人生 > >Java代理模式 動態代理 的應用場景

Java代理模式 動態代理 的應用場景

先看一下代理模式,這個應該是設計模式中最簡單的一個了,類圖

代理模式類圖

  代理模式最大的特點就是代理類和實際業務類實現同一個介面(或繼承同一父類),代理物件持有一個實際物件的引用,外部呼叫時操作的是代理物件,而在代理物件的內部實現中又會去呼叫實際物件的操作

 Java動態代理其實內部也是通過Java反射機制來實現的,即已知的一個物件,然後在執行時動態呼叫其方法,這樣在呼叫前後作一些相應的處理,這樣說的比較籠統,舉個簡單的例子

   比如我們在應用中有這樣一個需求,在對某個類的一個方法的呼叫前和呼叫後都要做一下日誌操作,

一個普通的介面

[java] view plain copy
 print?
  1. publicinterface AppService {  
  2.       publicboolean createApp(String name);  
  3. }  
 

該介面的預設實現類

[java] view plain copy  print?
  1. publicclass AppServiceImpl implements AppService {  
  2.     publicboolean createApp(String name) {  
  3.         System.out.println("App["+name+"] has been created."
    );  
  4.         returntrue;  
  5.     }  
  6. }  
 

日誌處理器

[java] view plain copy  print?
  1. publicclass LoggerInterceptor implements InvocationHandler {//注意實現這個Handler介面
  2.     private Object target;//目標物件的引用,這裡設計成Object型別,更具通用性
  3.     public LoggerInterceptor(Object target){  
  4.         this.target = target;  
  5.     }  
  6.     public Object invoke(Object proxy, Method method, Object[] arg)  
  7.             throws Throwable {  
  8.         System.out.println("Entered "+target.getClass().getName()+"-"+method.getName()+",with arguments{"+arg[0]+"}");  
  9.         Object result = method.invoke(target, arg);//呼叫目標物件的方法
  10.         System.out.println("Before return:"+result);  
  11.         return result;  
  12.     }  
  13. }  

外部呼叫

[java] view plain copy  print?
  1. publicclass Main {  
  2.     publicstaticvoid main(String[] args) {  
  3.         AppService target = new AppServiceImpl();//生成目標物件
  4.         //接下來建立代理物件
  5.         AppService proxy = (AppService) Proxy.newProxyInstance(  
  6.                 target.getClass().getClassLoader(),  
  7.                 target.getClass().getInterfaces(), new LoggerInterceptor(target));  
  8.         proxy.createApp("Kevin Test");  
  9.     }  
  10. }  
 此外,可以使用Spring AOP 。