-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstrategy_pattern.py
More file actions
137 lines (89 loc) · 2.64 KB
/
strategy_pattern.py
File metadata and controls
137 lines (89 loc) · 2.64 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from __future__ import annotations
from abc import ABC, abstractmethod
class FlyBehavior:
@abstractmethod
def fly(self):
pass
class QuackBehavior:
@abstractmethod
def quack(self):
pass
class Ducks:
def __init__(
self, type_name, flyBehavior: FlyBehavior, quackBehavior: QuackBehavior
) -> None:
self.type_name = type_name
self._flyBehavior = flyBehavior
self._quackBehavior = quackBehavior
def swim(self):
print(f"{self.type_name} can swim, well all Ducks can swim")
@abstractmethod
def display(self):
pass
@property
def flyBehavior(self):
return self._flyBehavior
@property
def quackBehavior(self):
return self._quackBehavior
@flyBehavior.setter
def flyBehavior(self, flyBehavior: FlyBehavior) -> None:
self._flyBehavior = flyBehavior
@quackBehavior.setter
def quackBehavior(self, quackBehavior: QuackBehavior) -> None:
self._quackBehavior = quackBehavior
def performFly(self) -> None:
self.flyBehavior.fly()
def performQuack(self) -> None:
self.quackBehavior.quack()
class FlyWithWings(FlyBehavior):
def fly(self):
print("I',m flying")
class FlyNoWay(FlyBehavior):
def fly(self):
print("I cant't fly")
class Quack(QuackBehavior):
def quack(self):
print("Quack")
class MuteQuack(QuackBehavior):
"""docstring for ClassName"""
def quack(self):
print("<< Silence >>")
class Squeak(QuackBehavior):
"""docstring for Squeak"""
def qauck(self):
print("Squeak")
class MallardDuck(Ducks):
"""docstring for MallardDuck"""
def __init__(self, args=None):
super(MallardDuck, self).__init__("MallardDuck", FlyWithWings(), Quack())
self.display()
def display(self):
print("I am real Mallard Duck")
"""
Now lets change the fly behaviour on the fly with below example
"""
class ModelDuck(Ducks):
"""docstring for ModelDuck"""
def __init__(self):
super(ModelDuck, self).__init__("ModelDuck", FlyNoWay(), Quack())
self.display()
def display(self):
print("I'm model duck")
class FlyRocketPowered(FlyBehavior):
"""docstring for FlyRocketPowered"""
def fly(self):
print("I'm flying with Rocket")
def main():
mallard = MallardDuck()
mallard.performQuack()
mallard.performFly()
print("****")
modelduck = ModelDuck()
modelduck.performFly()
modelduck.performQuack()
modelduck.flyBehavior = FlyRocketPowered()
print("dynamically set")
modelduck.performFly()
if __name__ == "__main__":
main()