Зачем использовать шаблон прокси, если мы можем отложить дорогостоящие процедуры в RealClass?
Я недавно читал на Design Patterns, и есть что-то, чего я не понимаю в Proxy Pattern.
цитата из книги:
- Виртуальный прокси создает дорогие объекты по запросу. 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){...
Код в метод и вызывать его из всех методов, вы должны помнить, чтобы выполнить вызов. Это подвержено ошибкам и может вызвать проблемы в будущем, особенно для начинающих программистов, участвующих в проекте.