Замісник (шаблон проєктування)

Шаблон Proxy (Заступник) — Шаблон проєктування. Надає об'єкт, що контролює доступ, перехоплюючи всі виклики до нього.

Проблема

Необхідно керувати доступом до об'єкта так, щоб створювати громіздкі об'єкти «на вимогу».

Вирішення

Створити сурогат громіздкого об'єкта. «Заступник» зберігає посилання, яке дозволяє заступникові звернутися до реального суб'єкта (об'єкт класу «Заступник» може звертатися до об'єкта класу «Суб'єкт», якщо інтерфейси «Реального Суб'єкта» і «Суб'єкта» однакові). Оскільки інтерфейс «Реального Суб'єкта» ідентичний інтерфейсу «Суб'єкта», так, що «Заступника» можна підставити замість «Реального Суб'єкта», контролює доступ до «Реального Суб'єкта», може відповідати за створення або видалення «Реального Суб'єкта». «Суб'єкт» визначає загальний для «Реального Суб'єкта» і «Заступника» інтерфейс, так, що «Заступник» може бути використаний скрізь, де очікується «Реальний Суб'єкт».

«Заступник» може мати і інші обов'язки, а саме:

  • віддалений «Заступник» може відповідати за кодування запиту і його аргументів і відправку закодованого запиту реальному «Суб'єктові»
  • віртуальний «Заступник» може кешувати додаткову інформацію про реального «Суб'єкта», щоб відкласти його створення
  • захищаючий «Заступник» може перевіряти, чи має клієнтський об'єкт необхідні для виконання запиту права.

Типи замісника

  • Кеш проксі. Кеш проксі покращує продуктивність реального об'єкта, коли вони виконують довгі операції, а результат цих операцій рідко змінюється. Наприклад, реальний об'єкт містить метод, що рахує прості числа. При першому виклику проксі делегує операцію реальному об'єкту і зберігає результат повернення. При всіх наступних викликах, проксі повертає кешовану інформацію.
  • Проксі захисту. Проксі захисту, додає рівень захисту над реальним об'єктом. Наприклад, реальний об'єкт може отримати доступ до бази даних і повернути конфіденційні дані користувачу. Проксі-захисник міг би додати методи або властивості, які дозволяють клієнтському об'єкту забезпечити відповідну аутентифікацію, перш ніж повернути дані. Він також може фільтрувати дані відповідно до прав автентифікованого користувача.
  • Віддалений проксі. Віддалений проксі-сервер надає локальний об'єкт, який посилається на реальний об'єкт в іншому місці, як правило, через мережеве з'єднання. Проксі виконує необхідні дії для кодування запитів на передачу мережі і приймає результати від віддаленого ресурсу, перш ніж повертати їх клієнту. Звичайний приклад віддаленого проксі-сервера - це локальний клас, створений Visual Studio для забезпечення доступу до вебслужби.
  • Розумний проксі. Розумний проксі додає додаткову функціональність реальному об'єкта. Ця функціональність часто невидима для клієнта. Наприклад, підрахунок існуючих посилань на ресурсомісткий об'єкт таким чином, що коли лічильник досягне нуля, дані об'єкта можуть бути видалені з пам'яті. Можна також використовувати розумний проксі для логування викликів користувача до реального об'єкта.
  • Віртуальний проксі. Віртуальний проксі забезпечує спрощену версію складного об'єкта. Тільки тоді, коли потрібні дані реального об'єкта, лише тоді він створюється, забезпечуючи форму лінивої ініціалізації. Наприклад, провідник Windows, може відобразити файли, який видно на екрані. При отриманні списку файлів, ім'я файлу, розмір та інша легка для отримання інформація зберігатиметься в об'єктах проксі. Тільки при команді "перегляд документа", реальний об'єкт буде створено і заповнено повним вмістом файлу, оскільки вони доступні повільніше і потребують більше пам'яті.

Переваги

  • віддалений замісник;
  • віртуальний замісник може виконувати оптимізацію;
  • захищає замісника;
  • «Розумне» посилання (вказівник);

Недоліки

  • Різко збільшує час відгуку

Реалізація

C++

C#

Посилання

Література

Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.