Назад к вопросам
Middle
64
questionbank

Что такое паттерн проектирования Заместитель (Proxy)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Паттерн проектирования Заместитель (Proxy) — структурный паттерн, который предоставляет суррогат или наполнитель для другого объекта, чтобы контролировать доступ к нему.

Proxy может использоваться для:

  • Ленивой инициализации (Virtual Proxy): Откладывает создание дорогостоящего объекта до тех пор, пока он действительно не понадобится.
  • Контроля доступа (Protection Proxy): Определяет, имеет ли вызывающий объект права на выполнение операции.
  • Ведения логов (Logging Proxy): Записывает информацию о вызовах методов.
  • Удаленного доступа (Remote Proxy): Представляет объект, находящийся в другом адресном пространстве.

Основные участники:

  • Subject: Интерфейс, который определяет общий контракт для реального объекта и заместителя.
  • RealSubject: Реальный объект, выполняющий работу.
  • Proxy: Заместитель, который имеет ссылку на RealSubject и контролирует доступ к нему.
# Subject Interface
class Subject:
    def request(self):
        pass

# RealSubject
class RealSubject(Subject):
    def request(self):
        print("RealSubject: Handling request.")

# Proxy
class Proxy(Subject):
    def __init__(self, real_subject):
        self._real_subject = real_subject

    def request(self):
        if self._check_access():
            self._real_subject.request()
            self._log_access()

    def _check_access(self):
        print("Proxy: Checking access prior to firing a real request.")
        # Implement access control logic here
        return True

    def _log_access(self):
        print("Proxy: Logging the time of request.")
        # Implement logging logic here

# Client Code
# client_code(RealSubject()) # Direct access
# client_code(Proxy(RealSubject())) # Access through Proxy

def client_code(subject):
    subject.request()

# Example Usage
print("Client: Executing the client code with a real subject:")
client_code(RealSubject())

print("\nClient: Executing the same client code with a proxy:")
client_code(Proxy(RealSubject()))

Преимущества:

  • Контролирует доступ к объекту.
  • Повышает производительность за счет ленивой инициализации.
  • Обеспечивает удаленный доступ к объектам.
  • Может добавлять дополнительное поведение (логирование, кэширование) без изменения реального объекта.

Недостатки:

  • Может увеличить сложность системы.
  • Вызовы методов через Proxy могут быть медленнее, чем прямые вызовы.