Назад к вопросам
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 могут быть медленнее, чем прямые вызовы.