動態代理在很多場景下都有使用:比如 rpc 之類的。
但是看很多地方,并沒有講清楚,為什么要使用動態代理,相對于靜態代理的優勢在哪里?-》代碼簡潔
首先,來看看什么是靜態代理
靜態代理
public interface FontProvider {
Font getFont(String name);
}
public abstract class ProviderFactory {
public static FontProvider getFontProvider() {
return new FontProviderFromDisk();
}
}
public class Main() {
public static void main(String[] args) {
FontProvider fontProvider = ProviderFactory.getFontProvider();
Font font = fontProvider.getFont("微軟雅黑"); ......
}
}
緩存
public class CachedFontProvider implements FontProvider {
private FontProvider fontProvider;
private Map<String, Font> cached;
public CachedFontProvider(FontProvider fontProvider) {
this.fontProvider = fontProvider;
}
public Font getFont(String name) {
Font font = cached.get(name);
if (font == null) {
font = fontProvider.getFont(name);
cached.put(name, font);
}
return font;
}
}
/* 對工廠類進行相應修改,代碼使用處不必進行任何修改。 這也是面向接口編程以及工廠模式的一個好處 */
public abstract class ProviderFactory {
public static FontProvider getFontProvider() {
return new CachedFontProvider(new FontProviderFromDisk());
}
}
上面不直接修改FontProviderFromDisk是因為還有可能出現其他情況的provider
動態代理
上述代碼有沒有發現一個問題?
如果FontProvider類似的類越來越多,ProviderFactory就必須實現多個get方法
那么業務增長帶來的就是代碼臃腫
所以,動態代理是用來解決這個問題的。
具體可以參考網上實現:Proxy,InvocationHandler