美文网首页
java - 动态代理

java - 动态代理

作者: canezk | 来源:发表于2016-11-23 22:18 被阅读10次
    动态代理在很多场景下都有使用:比如 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
    

    相关文章

      网友评论

          本文标题:java - 动态代理

          本文链接:https://www.haomeiwen.com/subject/lxavpttx.html