Skip to content

Commit ca00725

Browse files
committed
Add Visitor Pattern
1 parent 68ea8e4 commit ca00725

File tree

112 files changed

+1099
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+1099
-0
lines changed

patterns/behavioural/visitor/problem_01/__init__.py

Whitespace-only changes.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from .algorithm import Algorithm
2+
from .print import Print
3+
4+
__all__ = ["Algorithm", "Print"]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from typing import Protocol
2+
3+
from ..files import SealedFileType
4+
5+
6+
class Algorithm(Protocol):
7+
def visit(self, element: SealedFileType) -> None:
8+
...
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from ..files import SealedFileType, Audio, Text, Image
2+
3+
from typing import TypeVar, Generic
4+
5+
T = TypeVar("T", bound=SealedFileType)
6+
7+
8+
class Print(Generic[T]):
9+
def visit(self, element: T) -> None:
10+
if isinstance(element, Audio):
11+
PrintAudio().visit(element)
12+
return
13+
elif isinstance(element, Text):
14+
PrintText().visit(element)
15+
return
16+
17+
PrintImage().visit(element)
18+
19+
20+
class PrintAudio(Print[Audio]):
21+
def visit(self, element: Audio) -> None:
22+
print(f"{element.codec=}")
23+
24+
25+
class PrintText(Print[Text]):
26+
def visit(self, element: Text) -> None:
27+
print(f"{element.encoding=}")
28+
29+
30+
class PrintImage(Print[Image]):
31+
def visit(self, element: Image) -> None:
32+
print(f"{element.width=}, {element.height=}")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from .audio import Audio
2+
from .text import Text
3+
from .image import Image
4+
5+
from typing import Union
6+
7+
SealedFileType = Union[Audio, Text, Image]
8+
9+
__all__ = ["Audio", "Text", "Image", "SealedFileType"]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from dataclasses import dataclass
2+
from .filetype import FileType
3+
4+
5+
@dataclass
6+
class Audio(FileType):
7+
codec: str = "mp4"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from abc import ABC
2+
3+
from dataclasses import dataclass
4+
5+
6+
@dataclass
7+
class FileType(ABC):
8+
name: str = "asdf"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from dataclasses import dataclass
2+
from .filetype import FileType
3+
4+
5+
@dataclass
6+
class Image(FileType):
7+
height: float = 1080
8+
width: float = 1920
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from dataclasses import dataclass
2+
from .filetype import FileType
3+
4+
5+
@dataclass
6+
class Text(FileType):
7+
encoding: str = "utf-8"

patterns/behavioural/visitor/problem_01/ifelif_subclassing.md

Whitespace-only changes.

0 commit comments

Comments
 (0)