【问题标题】:Why bother using the proxy pattern when we can defer the expensive procedures in the RealClass?当我们可以推迟 RealClass 中昂贵的过程时,为什么还要使用代理模式呢?
【发布时间】:2016-06-02 13:36:03
【问题描述】:

我最近一直在阅读Design Patterns,关于代理模式我有些不明白。

引用本书:

  1. 虚拟代理按需创建昂贵的对象。 Motivation 中描述的 ImageProxy 就是这种代理的一个示例。

我知道这种模式可用于按需创建昂贵的对象。 而this example也很好的说明了用法。

下面是代理类RealImage的构造函数。方法loadFromDisk() 表示昂贵的过程。

   public RealImage(String fileName){
      this.fileName = fileName;
      loadFromDisk(fileName);
   }

the example 中的代理类 ProxyImage 正是它的本意:按需创建昂贵的对象。

但我的问题是:为什么我们不能直接从构造函数中删除昂贵的loadFromDisk() 方法并将其放在绝对需要的地方,

喜欢这里吗?

  public void display() {
      if(!loaded){
          loadFromDisk(fileName);
          loaded = true;
      }
      //then display
   }

那么,为什么还要使用代理呢?

【问题讨论】:

    标签: java oop design-patterns proxy-pattern


    【解决方案1】:

    代理模式在这种情况下解决的问题是代码重复。想象一下这样一种情况,您有几十个类似于display() 的方法,其中需要检查loaded 标志。您的代码如下所示:

    public void display() {
        if(!loaded){
            loadFromDisk(fileName);
            loaded = true;
        }
        //then display
    }
    public void resize(double scale) {
        if(!loaded){
            loadFromDisk(fileName);
            loaded = true;
        }
        //then resize
    }
    ... // more methods go here
    public void save() {
        if(!loaded){
            loadFromDisk(fileName);
            loaded = true;
        }
        //then save
    }
    

    即使你把if(!loaded){...代码放到一个方法中,从所有方法中调用,你也需要记住执行调用。这很容易出错,并且可能会导致后续出现问题,尤其是对于刚进入该项目的程序员而言。

    【讨论】:

    • 如果RealClass中有多个昂贵的程序,并且每个程序都需要不同的方法怎么办?如何处理Proxy Pattern?会不会因为ProxyClasscreate on demand 实际上会调用一些昂贵但不必要的程序而变得不那么有效?
    • @du369 代理不是用来处理缓慢的对象构造。昂贵的构造函数只是代理有用的一种特定情况,但代理的主要想法是在接口后面隐藏有关对象的一些细节。当你有多个昂贵的方法时,不妨让方法的第一个调用者承担调用它们的费用,然后缓存结果。
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多