-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path10.strategy.py
111 lines (75 loc) · 2.59 KB
/
10.strategy.py
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
""" 행위(Behavioral) 패턴
https://gmlwjd9405.github.io/2018/07/06/strategy-pattern.html
https://refactoring.guru/design-patterns/strategy
행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
유사하지만 다른 작업을 수행하는 여러 전략을 클래스 형태로 캡슐화,
단순히 전략을 만들거나 교체함으로써 행위를 자유롭게 수정할 수 있음 (OCP)
Bridge 와 상당히 유사한 구조를 가짐
- 구체적인 기능에 대한 구현을 외부 클래스에 위임함 (OCP)
+ 기능에 대한 수정-확장이 매우 유연함
State 패턴과 유사하지만 조금 다르게 활용됨
- Strategy 패턴은 상속을 통해 다양한 variation(수정-확장)에 유연하게 대응
- State 패턴은 조건문 분기를 효율적으로 처리하기에 유용
"""
from abc import ABC, abstractmethod
# context
class Pocketmon:
def set_moving_strategy(self, moving_strategy):
self.moving_strategy = moving_strategy
def move(self):
self.moving_strategy.execute()
def set_attack_strategy(self, attack_strategy):
self.attack_strategy = attack_strategy
def attack(self):
self.attack_strategy.execute()
# strategy
class Strategy(ABC):
@abstractmethod
def execute(self):
pass
# moving strategies
class MovingStrategy(Strategy):
def execute(self):
print('Action "Moving" is selected')
class Swim(MovingStrategy):
def execute(self):
super().execute()
print("Swim!")
class Run(MovingStrategy):
def execute(self):
super().execute()
print("Run!")
class Fly(MovingStrategy):
def execute(self):
super().execute()
print("Fly!")
# attack strategies
class AttackStrategy(Strategy):
def execute(self):
print('Action "Attack" is selected')
class ThunderBolt(AttackStrategy):
def execute(self):
super().execute()
print("Thunder Bolt!!")
class WaterBomb(AttackStrategy):
def execute(self):
super().execute()
print("Water Bomb!!")
class FireBreath(AttackStrategy):
def execute(self):
super().execute()
print("Fire Breath!!")
if __name__ == "__main__":
print("Go Lizardmon!")
lizardmon = Pocketmon()
lizardmon.set_moving_strategy(Fly())
lizardmon.set_attack_strategy(FireBreath())
lizardmon.move()
lizardmon.attack()
print("=" * 50)
print("Go Kobugi!")
kobugi = Pocketmon()
kobugi.set_moving_strategy(Swim())
kobugi.set_attack_strategy(WaterBomb())
kobugi.move()
kobugi.attack()