Зачем использовать шаблон прокси, если мы можем отложить дорогостоящие процедуры в RealClass?

Я недавно читал на Design Patterns, и есть что-то, чего я не понимаю в Proxy Pattern.

цитата из книги:

  1. Виртуальный прокси создает дорогие объекты по запросу. 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
   }

Так зачем вообще использовать прокси?

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){... Код в метод и вызывать его из всех методов, вы должны помнить, чтобы выполнить вызов. Это подвержено ошибкам и может вызвать проблемы в будущем, особенно для начинающих программистов, участвующих в проекте.

Другие вопросы по тегам