Цепочка обязанностей - позволяет передавать запросы по цепочке обработчиков. Каждый обработчик решает, может ли он обработать запрос или передает его дальше.

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

Пример: `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`