当我们可以推迟 RealClass 中昂贵的过程时,为什么还要费心使用代理模式呢?

Why bother using the proxy pattern when we can defer the expensive procedures in the RealClass?

我最近在看Design Patterns,关于代理模式我有些不明白。

书中引述:

  1. A virtual proxy creates expensive objects on demand. The ImageProxy described in the Motivation is an example of such a proxy.

我了解到此模式可用于按需创建昂贵的对象。 而this example也很好地说明了用法。

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

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

the example 中的代理 class ProxyImage 做的正是它打算做的事情:按需创建昂贵的对象。

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

喜欢这里吗?

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

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

代理模式在这种情况下解决的问题是代码重复。想象一下这样一种情况,您有许多类似于 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){...代码放入一个方法中并从所有方法中调用它,您也需要记住执行调用。这很容易出错,并且可能会在以后导致问题,特别是对于刚进入该项目的新程序员。