定義
由程序員創(chuàng)建或工具生成代理類的源碼,再編譯代理類郎仆。所謂靜態(tài)也就是在程序運(yùn)行前就已經(jīng)存在代理類的字節(jié)碼文件塌鸯,代理類和委托類的關(guān)系在運(yùn)行前就確定了。
步驟
定義委托類subject
定義實現(xiàn)類realSubject
定義代理類proxy
客戶端調(diào)用
demo
場景是完成一個UserManager的query調(diào)用
package proxy;
public class Main {
//定義委托類subject
interface UserManager {
void query();
}
//定義實現(xiàn)類realSubject 實現(xiàn)委托類
static class UserManagerImpl implements UserManager {
@Override
public void query() {
System.out.println("query");
}
}
//定義代理類proxy 實現(xiàn)委托類
static class UserManagerProxy implements UserManager {
UserManager userManager;
//引入實現(xiàn)類
UserManagerProxy(UserManager userManager) {
this.userManager = userManager;
}
@Override
public void query() {
//調(diào)用實現(xiàn)類的對應(yīng)方法
userManager.query();
}
}
public static void main(String[] args) {
UserManagerProxy proxy = new UserManagerProxy(new UserManagerImpl());
proxy.query();
}
}
AOP的體現(xiàn)
現(xiàn)在假設(shè)需要知道query執(zhí)行的前后時間姐赡,怎么辦
直接在UserManagerProxy#query前后分別記錄時間即可莱预,和業(yè)務(wù)層,實現(xiàn)類UserManagerImpl 無關(guān)
體現(xiàn)出代理能夠完成
預(yù)處理项滑、過濾依沮、將請求分派給委托類處理、以及委托類執(zhí)行完請求后的后續(xù)處理
靜態(tài)代理的缺點
1.代碼維護(hù)的復(fù)雜,冗余
因為實現(xiàn)類和代理類 都 實現(xiàn)了 委托類 這個接口枪狂,比如
UserManager 新增create()方法
那么UserManagerProxy 以及 UserManagerImpl 都需要新增create()方法
2.代理類只服務(wù)于一種類型的對象
比如說這里UserManagerProxy只服務(wù)于UserManager類型對象
之后如果有AManager,就得有AProxy危喉,有BManager,就得有BProxy
那這樣如果有n個委托類州疾,那么就有n個代理類
refer
http://layznet.iteye.com/blog/1182924
http://blog.csdn.net/hejingyuan6/article/details/36203505
http://www.cnblogs.com/fingerboy/p/5335328.html