Заместитель - предоставляет объект-заменитель для другого объекта, контролируя доступ к нему. Можно представить это как прослойку между клиентом и реальным объектом, добавляя логику.
Стоит использовать когда нужно лениво инициализировать ресурсоемкий объект, для контроля доступа к объекту, для кеширования результатов работы и в распределенных системах.
Используется в 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`