Skip to content

Commit 91c9467

Browse files
authored
Create chain_of_responsability.py
1 parent f89db31 commit 91c9467

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from __future__ import annotations
2+
from abc import ABC, abstractmethod
3+
from typing import Any, Optional
4+
5+
6+
class Handler(ABC):
7+
@abstractmethod
8+
def set_next(self, handler: Handler) -> Handler:
9+
pass
10+
11+
@abstractmethod
12+
def handle(self, request) -> Optional[str]:
13+
pass
14+
15+
16+
class AbstractHandler(Handler):
17+
_next_handler: Handler = None
18+
19+
def set_next(self, handler: Handler) -> Handler:
20+
self._next_handler = handler
21+
22+
return handler
23+
24+
@abstractmethod
25+
def handle(self, request) -> str | None:
26+
if self._next_handler:
27+
return self._next_handler.handle(request)
28+
29+
return super().handle(request)
30+
31+
32+
# Concrete handlers
33+
class MonkeyHandler(AbstractHandler):
34+
def handle(self, request) -> str | None:
35+
if request == "Banana":
36+
return f"Monkey: I'll eat the {request}"
37+
else:
38+
return super().handle(request)
39+
40+
41+
class SquirrelHandler(AbstractHandler):
42+
def handle(self, request) -> str | None:
43+
if request == "Nut":
44+
return f"Squirrel: I'll eat the {request}"
45+
else:
46+
return super().handle(request)
47+
48+
49+
class DogHandler(AbstractHandler):
50+
def handle(self, request) -> str | None:
51+
if request == "MeatBall":
52+
return f"Dog: I'll eat the {request}"
53+
else:
54+
return super().handle(request)
55+
56+
57+
def client_code(handler: Handler) -> None:
58+
for food in ["Nut", "Banana", "Cup of coffe"]:
59+
print(f"\nClient: Who wants a {food}?")
60+
result = handler.handle(food)
61+
62+
if result:
63+
print(f"{result}", end="")
64+
else:
65+
print(f"{food} was left untouched.", end="")
66+
67+
68+
if __name__ == "__main__":
69+
monkey = MonkeyHandler()
70+
squirrel = SquirrelHandler()
71+
dog = DogHandler()
72+
73+
monkey.set_next(squirrel).set_next(dog)
74+
75+
print("Chain: Monkey > Squirrel > Dog")
76+
client_code(monkey)
77+
print("\n")
78+
79+
print("Subchain: Squirrel > Dog")
80+
client_code(squirrel)

0 commit comments

Comments
 (0)