Шаблон прокси-дизайна: недостатки

Я просматривал один из паттернов "Статьи о прокси".

Прочитайте комментарии после объяснения

В этой статье есть несколько недостатков, упомянутых для шаблонов прокси, но я не могу понять:

1) Обратной стороной здесь может быть "магия", о которой не знает экстендер (проблема "черного ящика"). Пожалуйста, объясните магию.

2) Прокси-сервер может маскировать жизненный цикл и состояние энергозависимого ресурса от своего клиента. Клиент может вызвать прокси, не понимая, что ресурс в данный момент недоступен... в этом случае прокси должен либо заблокировать, пока ресурс снова не станет доступным, либо он должен вызвать какую-то ошибку. В терминах Java это должно быть непроверенное исключение, так как Прокси должен соответствовать интерфейсу исходного объекта. Кроме того, клиент может не знать, что ресурс, который он вызывает сейчас, не тот ресурс, который он вызвал секунду назад; если на ресурсе есть какое-либо состояние, то клиент может быть смущен тем, что состояние, по-видимому, забыто.

Пожалуйста, объясни.

3) если прокси-сервер используется для представления удаленного ресурса в локальном процессе, это может скрыть тот факт, что используется удаленная связь. Как мы знаем, удаленный вызов полностью отличается от локального вызова, и наши программы не должны обрабатывать его так, как если бы он был одинаковым. Лучше, если прокси-сервер как-то объявит, что он является прокси для удаленного ресурса, а не локального ресурса. Тогда клиенты смогут выбрать только локальные ресурсы или изменить свое поведение при использовании удаленного ресурса.

Не могли бы вы помочь мне понять три пункта выше, связанных с недостатками прокси-сервера?

1 ответ

Это делает 3 разных вопроса. Я отвечу на третий. Вам лучше отредактировать свой вопрос на один и задать каждый из двух других в отдельном вопросе.

При работе с удаленным сервером часто используется шаблон прокси (например, RMI). Вы получаете ссылку на объект из какой-то фабрики, и на самом деле вы получаете заглушку (прокси), которая для каждого вызываемого вами метода сериализует аргументы метода, отправляет их на сервер, ждет ответа, и возвращает результат. Прокси делает это почти прозрачным, но не зная, что все это происходит за кулисами, вы можете очень неэффективно кодировать вещи.

Возьмите этот пример для примера:

if (account.getBalance() > 0 && account.getBalance() < MAX) {
    transferAmount(account.getBalance() / 2);
}

Теперь представьте, что account является прокси для удаленного объекта. Каждый раз getBalance() вызывается удаленный сетевой вызов, который потенциально может привести к исключению или даже возвращать другое значение каждый раз, делая этот простой фрагмент кода крайне неэффективным.

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