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

标签 java oop design-patterns proxy-pattern

我一直在阅读 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也很好地说明了用法。

下面是代理类 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
   }

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

最佳答案

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

关于java - 当我们可以推迟 RealClass 中昂贵的过程时,为什么还要费心使用代理模式呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531403/

相关文章:

java - URLClassLoader 无法动态从 jar 加载类

java - 寻找一次读取的内存缓存

c++ - 我怎样才能使模型开发更容易

JavaScript JS 类方法用于更改从另一个方法作为参数发送的属性值

c++ - C++ 中带有模板的装饰器模式

java - 当连接在事务中关闭时会发生什么?

java swing设计创建一个文本字段

PHP抽象类站点配置

java - 如何使用复合模式访问特定的叶子?

c++ - 确保内部共享库版本正确