要想了解代理模式首先要知道什麼是代理模式?代理模式的使用場景是什麼,有什麼優缺點。顧名思義,代理模式關鍵就是一個代理,爲什麼要代理,是因爲原來的業務類已經不能滿足需求的變化,如果直接在原來的業務類上修改,改動工作量大,而且容易引發新的問題,因此我們需要一個代理類,在代理類實現業務的擴展需要,實際上代理類並不真正實現服務,而是通過調用委託類的相關方法提供特定的服務。代理又包含靜態代理和動態代理,靜態代理是在程序運行前代理類的class字節碼文件已經生成了,而動態代理則是在程序運行的過程中通過反射創建的。
一、靜態代理
-
創建服務接口
public interface Work { //定義一個名字爲work的方法 void work(); }
-
業務類實現接口,並實現接口
public class WorkImpl implements Work{ @Override public void work() { System.out.println("開始工作"); } }
3.這個類實現了工作方法,但是我們要在工作前加入吃飯,工作後加入健身的邏輯,創建代理類。
public class WorkProxy implements Work{ private Work work; public WorkProxy(final Work work) { this.work = work; } @Override public void work() { System.out.println("吃飯"); work.work(); System.out.println("進行健身"); } }
4.進行測試。
public class TestProxy { public static void main(String[] args) { Work work = new WorkImpl(); work.work(); System.out.println("----------"); WorkProxy workProxy = new WorkProxy(work); workProxy.work(); } }
測試結果:
開始工作
----------
吃飯
開始工作
進行健身
優點:我們在不改變原有對象的基礎上,對原來的對象進行了擴展。
缺點:如果我們需要擴展的對象比較多,爲每個對象創建代理類工作量也很大。
二、動態代理
使用動態代理的話,我們不需要手動創建代理類,真正的代理對象有JDK在我們使用的時候創建,我們需要編寫動態處理器。
1.動態處理器編寫。
package com.chongzi.keji.other; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicProxy implements InvocationHandler{ private Object object; public DynamicProxy(final Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("吃飯"); Object result = method.invoke(object, args); System.out.println("開始健身"); return result; } }
2.測試類的編寫。
package com.chongzi.keji.other; import java.lang.reflect.Proxy; public class DynamicTest { public static void main(String[] args) { Work work = new WorkImpl(); Work proxyWork = (Work)Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), new Class[]{Work.class},new DynamicProxy(work)); proxyWork.work(); } }
測試結果:
吃飯
開始工作
開始健身