Определение Заместитель - шаблон, контролирующий доступ к объектам, обеспечивая их более оптимальное взаимодействие.
Предоставляет объект-заместитель (surrogate) или объект-заменитель (placeholder) для доступа к другому объекту.
Оборачивая доступ к реальному компоненту, уменьшает сложность работы с ним.
Пример Банковский чек по сути является заместителем денег на банковском счете. Чек может быть использован вместо денег для покупок и по сути управляет доступом к деньгам на счете владельца.
Когда и где использовать шаблон Заместитель (Proxy)? В объектно-ориентированных языках объекты выполняют свою работу через предоставление клиентам своего публичного интерфейса. Клиенты этих объектов ожидают, что выполнение методов данного интерфейса будет выполнена быстро и эффективно. Однако, существуют ситуации, в которых объект достаточно "тяжелый", чтобы соответствовать ожидаемым требованиям. Обычно это возникает, когда существует зависимость от удаленного ресурса (например, вызов к другому компьютеру), или когда объект слишком долго инициализируется или загружается. В подобных ситуациях вы можете применить шаблон Заместитель (Proxy) и создать прокси объект, который замещает оригинальный объект. Заместитель перенаправляет запрос к целевому объекту. Интерфейс объекта Заместителя такой же как у оригинального объекта, поэтому клиенты могут даже не знать, что работают с прокси вместо реального объекта.
Существует три различных типа Заместителей: - Удаленные Заместители (remote proxies) ответственны за кодирование запроса и его перенаправление реальному объекту в другое адресное пространство (домен приложения, процесс или компьютер) - Виртуальные Заместители(virtual proxies) создают "тяжелые" объекты по требованию (этот процесс известен под разными названиями, такими как "just-in-time loading", "on-demand loading", "lazy loading"). - Защищающие прокси (protection proxies) контролируют, имеет ли вызывающая сторона права доступа для выполнения запроса.
Шаблон Заместитель в .NET Framework В .NET Framework шаблон Заместитель используется в инфраструктуре Remoting. В .NET Remoting, если объекту требуется доступ к объекту в другом адресном пространстве, (домен приложения, процесс или компьютер) создается прокси объект, который посылает запрос в удаленный объект и передает ему необходимые данные. Обычно клиент даже не догадывается о том, что взаимодействие происходит через прокси.
Клиенты WCF служб также часто используют автоматически генерируемые прокси объекты.
Шаблон Заместитель в сравнении с другими шаблонами. Адаптер обеспечивает отличающийся интерфейс к объекту. Прокси обеспечивает тот же самый интерфейс. Декоратор обеспечивает расширенный интерфейс.
Декоратор и Прокси имеют разные предназначения, но схожи по структуре. Оба шаблона описывают, как обеспечить косвенный доступ к другому объекту. Также их реализации хранят ссылку на объект, к которому перенаправляются запросы.