Сегодня я встретил понятие "прокси-паттерн" на jQuery.com, но ничего не мог сделать. По-видимому, это очень полезно, но я вообще не понимаю эту идею, это звучит чуждо мне. Может кто-нибудь, пожалуйста, объясните мне это простыми словами: "Как будто мне было 3 года"?
Что такое шаблон прокси-сервера JavaScript?
Ответ 1
Представьте, что у вас есть сайт со многими аякс-запросами. Есть изменения в дизайне. Теперь перед каждым запросом вы хотите отобразить некоторый пользовательский загрузочный gif. Вы можете изменить весь код, где есть запрос ajax, или вы можете использовать шаблон прокси.
var proxied = jQuery.ajax; // Preserving original function
jQuery.ajax = function() {
jQuery("#loading").dialog({modal: true});
return proxied.apply(this, arguments);
}
Ответ 2
В книге Javascript Patterns Стоян Стефанов описывает этот шаблон так:
В шаблоне прокси один объект действует как интерфейс к другому объекту. Прокси находится между клиентом объекта и самим объектом и защищает доступ к этому объекту.
Этот шаблон может выглядеть как накладные расходы, но он полезен для выполнения задач. Прокси-серверы играют роль опекуна для объекта (также называемого "реальным субъектом" ) и пытаются сделать этот объект как можно меньше работы.
Пример реального мира
Прокси-шаблон полезен, когда реальный субъект делает что-то дорогое. В Интернете приложений, одна из самых дорогих операций, которую вы можете сделать, это сетевой запрос, поэтому имеет смысл объединить HTTP-запросы как можно больше.
Здесь вы можете увидеть пример: http://www.jspatterns.com/book/7/proxy.html. (посмотрите исходный код).
У вас есть список видео на странице. Когда пользователь нажимает заголовок видео, область ниже заголовка расширяется, чтобы показать больше информации о видео, а также видео для воспроизведения. Подробная видеоинформация и URL-адрес видео не часть страницы; они должны быть получены путем совершения вызова веб-службы. Веб-сервис может принимать несколько идентификаторов видео, поэтому мы можем ускорить приложение, сделав меньше HTTP-запросы по возможности и получение данных для нескольких видео за один раз.
Объект видео не вызывает службу HTTP, а вызывает прокси. Затем прокси-сервер ждет ответа перед отправкой запроса. Если другие вызовы из видео поступают в период ожидания 50 мс, они будут объединены в один. Задержка в 50 мс практически незаметна для пользователя, но может помочь объединить запросы и ускорить работу при нажатии "переключение" и одновременном расширении нескольких видео. Это также значительно снижает нагрузку на сервер, так как веб-сервер должен обрабатывать меньшее количество запросов.
Без прокси
Proxy
Прокси в качестве кеша
Ответ 3
В общем - Proxy Pattern позволяет контролировать доступ к ресурсу. При этом он может решить несколько потенциальных проблем:
- предотвратить неправильное или вредоносное использование ресурса
- предотвратить/контролировать доступ к ресурсу, который слишком дорог для создания
jQuery используют термин довольно свободно, но их идея заключается в том, что вы переопределяете/скрываете существующий метод (в своем примере jQuery.fn.setArray
), добавляя к нему больше функций.
(function() { // envelop everyting in anonymous immediately called function
var proxied = jQuery.fn.setArray; // save current method
jQuery.fn.setArray = function() { // override the method
console.log(this, arguments); // add functionality
return proxied.apply(this, arguments); // call original method and return
// its result
};
})();
Ответ 4
Вот один пример прокси-шаблона, используемого для записи того, какие слушатели устанавливаются: Почему Google +1 записывает мои движения мыши?.
Ответ 5
Шаблон прокси обеспечивает суррогатный объект или объект-заполнитель для другого объекта и контролирует доступ к этому другому объекту.
В объектно-ориентированном программировании объекты выполняют работу, которую они рекламируют через свой интерфейс (свойства и методы). Клиенты этих объектов ожидают, что эта работа будет выполнена быстро и эффективно. Однако бывают ситуации, когда объект сильно ограничен и не может выполнить свою ответственность. Обычно это происходит, когда есть зависимость от удаленного ресурса (что приводит к задержке сети) или когда объект занимает много времени для загрузки.
В таких ситуациях вы применяете шаблон прокси и создаете прокси-объект, который "стоит за исходный объект. Прокси перенаправляет запрос целевому объекту. Интерфейс объекта Proxy совпадает с исходным объектом, и клиенты могут даже не знать, что они имеют дело с прокси, а не с реальным объектом.
Клиент. В примере кода: функция run()
- вызывает прокси для запроса операции.
Прокси - в примере кода: GeoProxy
-
предоставляет интерфейс, аналогичный реальному объекту
-
поддерживает ссылку, позволяющую прокси доступ к реальному объекту
-
обрабатывает запросы и перенаправляет их на реальный объект
RealSubject - в примере кода: GeoCoder
- определяет реальный объект, для которого запрашивается услуга.