先看一下代理模式,這個應該是設計模式中最簡單的一個了,類圖

代理模式最大的特點就是代理類和實際業務類實作同一個接口(或繼承同一父類),代理對象持有一個實際對象的引用,外部調用時操作的是代理對象,而在代理對象的内部實作中又會去調用實際對象的操作
Java動态代理其實内部也是通過Java反射機制來實作的,即已知的一個對象,然後在運作時動态調用其方法,這樣在調用前後作一些相應的處理,這樣說的比較籠統,舉個簡單的例子
比如我們在應用中有這樣一個需求,在對某個類的一個方法的調用前和調用後都要做一下日志操作,
一個普通的接口
public interface AppService {
public boolean createApp(String name);
}
該接口的預設實作類
public class AppServiceImpl implements AppService {
public boolean createApp(String name) {
System.out.println("App["+name+"] has been created.");
return true;
}
}
日志處理器
public class LoggerInterceptor implements InvocationHandler {//注意實作這個Handler接口
private Object target;//目标對象的引用,這裡設計成Object類型,更具通用性
public LoggerInterceptor(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] arg)
throws Throwable {
System.out.println("Entered "+target.getClass().getName()+"-"+method.getName()+",with arguments{"+arg[0]+"}");
Object result = method.invoke(target, arg);//調用目标對象的方法
System.out.println("Before return:"+result);
return result;
}
}
外部調用
public class Main {
public static void main(String[] args) {
AppService target = new AppServiceImpl();//生成目标對象
//接下來建立代理對象
AppService proxy = (AppService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(), new LoggerInterceptor(target));
proxy.createApp("Kevin Test");
}
}