动态代理在很多场景下都有使用:比如 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