使用代理模式的意圖有很多,比如因爲安全問題,需要屏蔽客戶端直接訪問真實對象;或者在遠程調用中,需要使用代理類處理遠程方法調用的技術細節(如RMI);也可能是爲了提升系統性能,對真實的對象進行封裝,從而達到延遲加載的目的。
在此主要討論使用代理模式實現延遲加載,從而提升系統的性能和反應速度。
在系統啓動時,將消耗資源多的方法使用代理模式分離,就可以加快系統的啓動速度,減少用戶的等待時間。在用戶真正做操作的時候,再由代理類單獨去加載真實的操作類,完成操作。這個過程就實現了延遲加載。
普通方式構造會比較慢
public class DBQuery {
public DBQuery(){
try{
Thread.slleep(1000);//可能包含耗時操作
}catch(InterruptedException e){
e.printStackTrace(e);
}
public String rquest(){
return "request string";
}
}
}
代理類是輕量對象,創建很快
public class DBQueryProxy{
private DBQuery real = null;
public String request(){
//在真正需要時才創建對象,創建過程可能很慢
if(real==null){
real = new DBQuery();
}
return real.request();
}
}
代理模式中還有一種動態代理
動態代理指在運行時,動態生成代理類。代理類的字節碼將在運行時生成並載入當前的ClassLoder。與靜態代理相比有很多好處,首先,不需要爲真實的主題寫一個形式上完全一樣的類,去除了不便於維護的缺點。其次,使用動態代理生成方法可以在運行時執行代理類的執行邏輯從而提高系統靈活性。
生成代理類可以使用:JDK代理,CGLIB代理,Javaassist代理,或者ASM庫。JDK代理比較簡單,但是CGLIB代理和Javaassist代理總體的性能會比JDK代理的性能要好。ASM的性能最好,但是它是低級的字節碼生成工具,使用過於繁瑣,所以除對性能有苛刻要求的場合外,推介使用CGLIB代理和Javaassist代理。