2013-08-18 2 views
0

Я прошел один из шаблонов статей о прокси.Дизайн прокси Дизайн: Недостатки

Read the Comments After the Explanation

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

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

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

Просьба пояснить.

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

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

ответ

1

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

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

Возьмем такой пример, например:

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

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

+0

Я считаю, что это объяснение также охватывает первый случай более или менее. Вы могли бы сказать, что прозрачное выполнение удаленных вызовов можно рассматривать как случай, когда происходит «волшебство», –