Skip to content

Instantly share code, notes, and snippets.

@VladislavSoren
Created August 27, 2024 11:25
Show Gist options
  • Select an option

  • Save VladislavSoren/d62a71cce0d75e7992c1347ffe9af701 to your computer and use it in GitHub Desktop.

Select an option

Save VladislavSoren/d62a71cce0d75e7992c1347ffe9af701 to your computer and use it in GitHub Desktop.
design_pattern_proxy_example
from abc import ABC, abstractmethod
class Subject(ABC):
"""
Интерфейс Субъекта объявляет общие операции как для Реального Субъекта, так
и для Заместителя. Пока клиент работает с Реальным Субъектом, используя этот
интерфейс, вы сможете передать ему заместителя вместо реального субъекта.
"""
@abstractmethod
def request(self) -> None:
pass
class RealSubject(Subject):
"""
Реальный Субъект содержит некоторую базовую бизнес-логику.
"""
def request(self) -> None:
print("RealSubject: Handling request.")
class Proxy(Subject):
"""
Интерфейс Заместителя идентичен интерфейсу Реального Субъекта.
"""
def __init__(self, real_subject: RealSubject) -> None:
self._real_subject = real_subject
def request(self) -> None:
"""
Наиболее распространёнными областями применения паттерна Заместитель
являются ленивая загрузка, кэширование, контроль доступа, ведение
журнала и т.д.
"""
if self.check_access():
self._real_subject.request()
self.log_access()
def check_access(self) -> bool:
print("Proxy: Checking access prior to firing a real request.")
return True
def log_access(self) -> None:
print("Proxy: Logging the time of request.", end="")
def client_code(subject: Subject) -> None:
"""
Клиентский код должен работать со всеми объектами (как с реальными, так и
заместителями) через интерфейс Субъекта, чтобы поддерживать как реальные
субъекты, так и заместителей.
"""
subject.request()
if __name__ == "__main__":
print("Client: Executing the client code with a real subject:")
real_subject = RealSubject()
client_code(real_subject)
print("")
print("Client: Executing the same client code with a proxy:")
proxy = Proxy(real_subject)
client_code(proxy)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment