代理模式
一、概述
代理是一種模式,提供了對目標對象的間接訪問方式,即通過代理訪問目標對象。如此便於在目標實現的基礎上增加額外的功能操作,前攔截,后攔截等,以滿足自身的業務需求,同時代理模式便於擴展目標對象功能的特點也為多人所用。
二、圖形描述

三、靜態代理
靜態代理的實現比較簡單,代理類通過實現與目標對象相同的接口,並在類中維護一個代理對象。通過構造器塞入目標對象,賦值給代理對象,進而執行代理對象實現的接口方法,並實現前攔截,后攔截等所需的業務功能。
/**
* 目標對象實現的接口
* @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動態代理。
