Заместитель - предоставляет объект-заменитель для другого объекта, контролируя доступ к нему. Можно представить это как прослойку между клиентом и реальным объектом, добавляя логику.

Стоит использовать когда нужно лениво инициализировать ресурсоемкий объект, для контроля доступа к объекту, для кеширования результатов работы и в распределенных системах.

Используется в ORM, @property, unittest.mock.patch и в RPC-системах.

В отличие от Декоратора, Адаптера и Фасада, Заместитель управляет доступом к объектам, а не изменяет их логику.

`from abc import ABC, abstractmethod

class Database(ABC): @abstractmethod def query(self, sql: str): pass

class RealDatabase(Database): def query(self, sql: str): print(f"Выполнение запроса: {sql}") return "Результат"

class DatabaseProxy(Database): def init(self, real_db: Database, user_role: str): self.real_db = real_db self.user_role = user_role

def query(self, sql: str): if self.user_role == "admin": return self.real_db.query(sql) else: raise PermissionError("Доступ запрещен")

#Использование

real_db = RealDatabase() proxy = DatabaseProxy(real_db, "user")

try: proxy.query("DROP TABLE users") # Ошибка доступа except PermissionError as e: print(e) # Доступ запрещен #weekofpatterns`