← Назад ко всем вопросам

Паттерн: Заместитель (Proxy)

1️⃣ Как кратко ответить

Паттерн "Заместитель" (Proxy) — это структурный паттерн проектирования, который предоставляет объект-заместитель для контроля доступа к другому объекту. Он используется для добавления дополнительной логики, такой как кэширование, контроль доступа или ленивую инициализацию, без изменения кода основного объекта.

2️⃣ Подробное объяснение темы

Паттерн "Заместитель" (Proxy) — это один из структурных паттернов проектирования, который позволяет создать объект, выступающий в роли интерфейса к другому объекту. Этот паттерн полезен, когда нужно контролировать доступ к объекту, добавлять дополнительную функциональность или оптимизировать работу программы.

Зачем нужен паттерн "Заместитель"?

  1. Контроль доступа: Proxy может ограничивать доступ к объекту, например, проверяя права пользователя перед выполнением операции.
  2. Кэширование: Proxy может хранить результаты операций и возвращать их, если они уже были вычислены, что экономит ресурсы.
  3. Ленивая инициализация: Proxy может откладывать создание ресурсоемкого объекта до момента, когда он действительно понадобится.
  4. Логирование и мониторинг: Proxy может записывать информацию о вызовах методов, что полезно для отладки и мониторинга.

Как работает паттерн "Заместитель"?

Proxy реализует тот же интерфейс, что и реальный объект, и содержит ссылку на него. Когда клиент вызывает метод Proxy, он может выполнить дополнительные действия до или после передачи вызова реальному объекту.

Пример использования

Рассмотрим пример с удаленным сервисом, к которому доступ может быть медленным или дорогим. Мы можем использовать Proxy для кэширования результатов.

class RealSubject:
    def request(self):
        print("RealSubject: Handling request.")
​
class Proxy:
    def __init__(self, real_subject):
        self._real_subject = real_subject
        self._cached_result = None
​
    def request(self):
        if self._cached_result is None:
            print("Proxy: Caching result for the first time.")
            self._cached_result = self._real_subject.request()
        else:
            print("Proxy: Returning cached result.")
        return self._cached_result
​
# Клиентский код
real_subject = RealSubject()
proxy = Proxy(real_subject)
​
# Первый вызов: кэширование результата
proxy.request()
​
# Второй вызов: использование кэша
proxy.request()

Где применяется паттерн "Заместитель"?

  • Сетевые соединения: для управления доступом к удаленным ресурсам.
  • Кэширование: для оптимизации производительности.
  • Контроль доступа: для проверки прав пользователя.
  • Ленивая инициализация: для отложенного создания объектов.

Тема: ООП
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки