平時一直在用spring,spring中最大的特效IOC和AOP,其中AOP使用的就是代理模式.閒着無聊,隨手寫了一個代理模式,也記錄下代理模式的實現Demo.java
好比如今有一個場景是:客戶想要增長一個新的功能,按照流程應該是客戶通知苦逼程序員增長功能,可是有一個問題,程序員並不清楚功能合理性與否,因此流程變爲,客戶找到項目經理,項目經理評估後,決定要作,則通知程序員加班作出來...程序員
在這個場景中,使用者是客戶,實現者是程序員,代理角色則是項目經理.代理模式簡單來講就是使用者須要實現一個功能,可是不關心底層由誰實現,經過代理類能夠自動匹配實現類的實現方法.好比在某些方法上須要作一些預處理,在代理類中,能夠統一添加.好比上邊例子,項目經理須要作一個時間統計,若是不用動態代理,有100個方法的話,就須要寫100次相同的代碼,極其麻煩.通常實現有兩種方式:靜態代理和動態代理,這裏只寫動態代理.spring
代碼以下:ide
功能接口:ICoder.java測試
public interface ICoder {
public abstract void implDemands(String demandName);
}this
功能實現類:Coder.java.net
public class Coder implements ICoder {
private String name;
public Coder(String name) {
this.name = name;
}
@Override
public void implDemands(String demandName) {
System.out.println(name + "用JAVA實現了" + demandName + "的需求!");
}
}代理
代理類:ProxyCoder.javacode
須要實現InvocationHandler接口,實現其中的方法invoke接口
public class ProxyCoder implements InvocationHandler{
private ICoder coder;
public ProxyCoder(ICoder coder) {
this.coder = coder;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Object result = method.invoke(coder, args);
return result;
}
}
測試類:
public static void main(String[] args) {
ICoder coder = new Coder("張三");
InvocationHandler proxyCoder = new ProxyCoder(coder);
ClassLoader classLoader = coder.getClass().getClassLoader();
ICoder proxy = (ICoder)Proxy.newProxyInstance(classLoader, coder.getClass().getInterfaces(), proxyCoder);
proxy.implDemands("張經理");
}
即實現動態代理.