2

我最近一直在阅读设计模式,关于代理模式有一些我不明白的地方。

书中引用:

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

我知道这种模式可用于按需创建昂贵的对象。这个例子也很好地说明了用法。

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

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

而示例ProxyImage中的代理类正是它所要做的:按需创建昂贵的对象。

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

像这儿?

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

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

4

1 回答 1

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){...代码放到一个方法中并从所有方法中调用它,你也需要记住执行调用。这很容易出错,并且可能会导致问题,特别是对于进入项目的新程序员。

于 2016-02-21T02:04:46.167 回答