Цепочка обязанностей - позволяет передавать запросы по цепочке обработчиков. Каждый обработчик решает, может ли он обработать запрос или передает его дальше.
Стоит использовать когда нужно обрабатывать запросы разными способами и конкретный обработчик заранее неизвестен или когда важно чтобы обработчики могли динамически меняться.
Пример: `class HttpHandler: def init(self, successor=None): self._successor = successor
def handle(self, request): if self.can_handle(request): return self.process_request(request) elif self.successor: return self.successor.handle(request) else: return "404 Not Found"
def _can_handle(self, request): raise NotImplementedError
def _process_request(self, request): raise NotImplementedError
class AdminHandler(HttpHandler): def _can_handle(self, request): return request.get("path") == "/admin"
def _process_request(self, request): return "Admin Panel"
class UserHandler(HttpHandler): def _can_handle(self, request): return request.get("path") == "/user"
def _process_request(self, request): return f"User Profile: {request.get('user_id')}"
class DefaultHandler(HttpHandler): def _can_handle(self, request): return True
def _process_request(self, request): return "Home Page"
#Клиентский кодchain = AdminHandler( UserHandler( DefaultHandler() ) )
print(chain.handle({"path": "/admin"})) # Admin Panel print(chain.handle({"path": "/user", "user_id": 42})) # User Profile: 42 print(chain.handle({"path": "/"})) # Home Page #weekofpatterns`