代理模式
一、概述
代理是一種模式,提供了對目標對象的間接訪問方式,即通過代理訪問目標對象。如此便於在目標實現的基礎上增加額外的功能操作,前攔截,后攔截等,以滿足自身的業務需求,同時代理模式便於擴展目標對象功能的特點也為多人所用。
二、圖形描述
三、靜態代理
靜態代理的實現比較簡單,代理類通過實現與目標對象相同的接口,並在類中維護一個代理對象。通過構造器塞入目標對象,賦值給代理對象,進而執行代理對象實現的接口方法,並實現前攔截,后攔截等所需的業務功能。
/** * 目標對象實現的接口 * @author jiyukai */ public interface BussinessInterface { void execute(); } /** * 目標對象實現類 * @author jiyukai */ public class Bussiness implements BussinessInterface{ @Override public void execute() { System.out.println("執行業務邏輯..."); } } /** * 代理類,通過實現與目標對象相同的接口 * 並維護一個代理對象,通過構造器傳入實際目標對象並賦值 * 執行代理對象實現的接口方法,實現對目標對象實現的干預 * @author jiyukai */ public class BussinessProxy implements BussinessInterface{ private BussinessInterface bussinessImpl; public BussinessProxy(BussinessInterface bussinessImpl) { this.bussinessImpl = bussinessImpl; } @Override public void execute() { System.out.println("前攔截..."); bussinessImpl.execute(); System.out.println("后攔截..."); } }
靜態代理的總結
優點:可以做到不對目標對象進行修改的前提下,對目標對象進行功能的擴展和攔截。
缺點:因為代理對象,需要實現與目標對象一樣的接口,會導致代理類十分繁多,不易維護,同時一旦接口增加方法,則目標對象和代理類都需要維護。
四、動態代理
動態代理是指動態的在內存中構建代理對象(需要我們制定要代理的目標對象實現的接口類型),即利用JDK的API生成指定接口的對象,也稱之為JDK代理或者接口代理。
/** * 動態代理對象,無需實現任何接口 * 通過傳入任何類型的目標對象並指定接口 * 調用JDK接口動態創建代理對象 * @author jiyukai */ public class ProxyFactory { private Object targetObject; public ProxyFactory(Object targetObject) { this.targetObject = targetObject; } public Object getProxyInstance(){ return Proxy.newProxyInstance( targetObject.getClass().getClassLoader(), //和目標對象的類加載器保持一致 targetObject.getClass().getInterfaces(), //目標對象實現的接口,因為需要根據接口動態生成對象 new InvocationHandler() { //InvocationHandler:事件處理器,即對目標對象方法的執行 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前攔截..."); Object result = method.invoke(proxy, args); System.out.println("后攔截..."); return result; } }); } }
動態代理的總結
優點:代理對象無需實現接口,免去了編寫很多代理類的煩惱,同時接口增加方法也無需再維護目標對象和代理對象,只需在事件處理器中添加對方法的判斷即可。
缺點:代理對象不需要實現接口,但是目標對象一定要實現接口,否則無法使用JDK動態代理。