java - 动态代理

2016-11-23  本文已影响10人  canezk
动态代理在很多场景下都有使用:比如 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
上一篇下一篇

猜你喜欢

热点阅读