Created
August 27, 2024 11:25
-
-
Save VladislavSoren/d62a71cce0d75e7992c1347ffe9af701 to your computer and use it in GitHub Desktop.
design_pattern_proxy_example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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