設計模式 --- 代理模式

靜態代理:

 1 public interface ICalFab {
 2     int calFaByLoop(int n);
 3     int calFabByRecursion(int n); 
 4 }
 5 
 6 class CalFabImp implements ICalFab{
 7     @Override
 8     public int calFaByLoop(int n) {
 9         int n1=1,n2= 1,n3=0;
10         for (int i = 3; i < n; i++) {
11             n3=n1+n2;
12             n1=n2;
13             n2=n3;
14         }
15         return n3;
16     }
17     @Override
18     public int calFabByRecursion(int n) {
19         if(n==1||n==2) return 1;
20         return calFabByRecursion(n-1)+calFabByRecursion(n-2);
21         
22     }
23     
24 }
25 /**
26  * 代理類每每依賴於被代理類
27  * @author 
28  */
29 class CalFabImplProxy implements ICalFab{
30     private ICalFab calFab;
31     public CalFabImplProxy() {}
32     public CalFabImplProxy(ICalFab calFab) {
33         this.calFab =calFab;
34     }
35     @Override
36     public int calFaByLoop(int n) {
37         long start = System.currentTimeMillis();
38         int result = calFab.calFaByLoop(n);
39         long end = System.currentTimeMillis();
40         System.out.println(end-start+"ms");
41         return result;
42     }
43 
44     @Override
45     public int calFabByRecursion(int n) {
46         long start = System.currentTimeMillis();
47         int result = calFab.calFabByRecursion(n); 
48         long end = System.currentTimeMillis();
49         System.out.println(end-start+"ms");
50         return result;
51     }
52     
53 }

 

 1 public class Invoker {
 2     public static void main(String[] args) {
 3 //        ICalFab imp = new CalFabImp();
 4 //        System.out.println(imp.calFabByRecursion(10));;
 5 //        imp.calFaByLoop(10); 
 6         //-- 構造被代理對象
 7         ICalFab imp = new CalFabImp();
 8         //-- 構造代理對象
 9         CalFabImplProxy proxy = new CalFabImplProxy(imp);
10         //-- 調用代理對象的業務方法:
11         proxy.calFabByRecursion(50);
12         proxy.calFaByLoop(50);
13     }
14 }

 

動態代理:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 動態代理模式:實現框架底層的核心
 * (1) 構建InvocationHandler對象
 * (2) 構建動態代理對象(利用被代理對象和InvocationHandler對象)
 * @author 張澤
 */
public class DynamicProxyDemo01 {
    public static void main(String[] args) {
        //-- 1. 構建被代理對象
        ICalFab calFab = new CalFabImp();
        //-- 2. 構造InvocationHandler對象
        CalFabInvocationHandler invocationHandler = 
                new CalFabInvocationHandler(calFab); 
        //-- 3.構建動態代理對象
        //-- arg0 : 傳被代理對象的類加載器對象
        //-- arg1 : 傳入被代理對象的所實現的接口
        //-- arg3 : 傳入InvocationHandler對象
        ICalFab dynamicProxy = (ICalFab)Proxy.newProxyInstance(
                calFab.getClass().getClassLoader(),
                calFab.getClass().getInterfaces(),
                invocationHandler);
        //-- 4. 利用代理對象調用業務方法
        dynamicProxy.calFaByLoop(40);
        dynamicProxy.calFabByRecursion(40);
    }
}


//-- 編寫InvocationHandler類要實現InvocationHandler接口
class CalFabInvocationHandler implements InvocationHandler{
    private Object target;    //-- 被代理對象
    
    public CalFabInvocationHandler() {}
    public CalFabInvocationHandler(Object target) {
        this.target = target;
    }
    /**
     * @param proxy 代理對象,這個對象是在程序運行的過程當中動態建立出來的
     * @param method 調用的方法
     * @param args 方法的參數
     * @return
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) 
        throws Throwable {
        //-- 1. 業務代碼前切入代碼
        long start = System.currentTimeMillis();
        //-- 2. 業務代碼
        Object result = method.invoke(target, args);//-- 調用被代理類的業務方法
        //-- 3. 業務代碼後切入代碼
        long end = System.currentTimeMillis();
        System.out.println((end - start)+"ms");
        return result;
    }
    
}
相關文章
相關標籤/搜索