-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpatterns.py
More file actions
104 lines (73 loc) · 2.17 KB
/
Copy pathpatterns.py
File metadata and controls
104 lines (73 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
"""
Builder Pattern
===============
complexity: ??
use case: Modeling
Parts:
- Consumer
- Director
- Builder
Builder Pattern seems to be what we see in ORMs, especially when it comes to
related models. Aside from the Director role, this pattern is all about creating
multiple objects at once and returning the instance to the view.
Also seems similar to what we create when integrating modules/creating APIs.
"""
class Book(object):
def __init__(self, title):
self.title = title
self.author = None
self.genre = None
def add_author(self, name):
self.author = name
print("Book author set.")
class LibraryBuilder(object):
"""Builder Pattern Example."""
def __init__(self, name, books=[]):
self.name = name
self.books = books
def add_book(self, name):
book = Book(name)
self.books.add(book)
print("Book added.")
class Librarian(object):
"""Director for the LibraryBuilder."""
def __init__(self):
self.builder = None
def setup_library(self, name, books=None):
lib = LibraryBuilder(name, books)
print("Library build complete.")
return lib
def add_book(self, book):
self.builder.add_book = book
"""
Adapter Pattern
===============
(aka, wrapper)
common uses: API integrations
Parts:
- Target interface (client)
- Adapter (mapping)
- Adaptee (new component)
This pattern is about mapping an old component to a new one.
Let's suppose a website had a music player. Users can use a play, pause and
forward skip button. Now suppose we have an audio library that can provide this
utility, but doesn't quite offer a play, puase or skip action.
"""
import abc
class MusicPlayer(metaclass=abc.ABCMeta):
def __init__(self):
self._player = AudioPlayer()
@abstractmethod
def play(self, track):
pass
class PlayerAdapter(MusicPlayer):
def play(self, track):
self._player.stream_audio(track)
class AudioPlayer:
def stream_audio(self, track):
# some logic to play a track
"""
Decorator Pattern
=================
Extends the functionality of an object dynamically. Recursive composition.
"""