[디자인패턴] 전략 패턴 with python


Head First Design Pattern 에 소개되는 예제를 파이썬으로 구현하였습니다.


전략 패턴(Strategy Pattern)

책에서는 전략 패턴을 아래와 같이 설명하고 있다.

전략 패턴은 알고리즘 군을 정의하고 각각을 캡슐화하여 상호 교체 가능하도록 만든다. 전략 패턴을 이용하면 알고리즘을 활용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.

예제 UML

예제 구현

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
#strategy pattern
from abc import ABCMeta, abstractmethod

class Doll(metaclass=ABCMeta):
def battery(self):
print("battery is ok")

@abstractmethod
def display(self):
pass

class Duck(metaclass=ABCMeta):
def swim(self):
print("swim")

@abstractmethod
def display(self):
pass

def performQuack(self):
return self.quack_behavior.quack()

def performFly(self):
return self.fly_behavior.fly()

def setFlyBehavior(self, obj):
self.fly_behavior = obj

def setQuackBehavior(self, obj):
self.quack_behavior = obj

class FlyBehavior(metaclass=ABCMeta):
@abstractmethod
def fly(self):
pass

class Fly(FlyBehavior):
def fly(self):
print("fly")

class CannotFly(FlyBehavior):
def fly(self):
print("I can't Fly")

class QuackBehavior(metaclass=ABCMeta):
@abstractmethod
def quack(self):
pass

class Quack(QuackBehavior):
def quack(self):
print("꽥꽥!")

class Bbick(QuackBehavior):
def quack(self):
print("삑삑!")


class MallardDuck(Duck):
def __init__(self):
self.quack_behavior = Quack()
self.fly_behavior = Fly()

def display(self):
print("I'm MallardDuck")

class DuckDoll(Duck, Doll):
def __init__(self):
self.quack_behavior = Bbick()
self.fly_behavior = CannotFly()

def display(self):
print("I'm Duck Doll")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
duck = MallardDuck()
duck.performQuack() #캡슐화
duck.performFly()
duck.display()

#꽥꽥!
#fly
#I'm MallardDuck


doll = DuckDoll()
doll.performQuack()
doll.performFly()
doll.display()
doll.battery()

#삑삑!
#I can't Fly
#I'm Duck Doll
#battery is ok
1
2
3
4
5
6
7
8
9
10
11
class Quk(QuackBehavior):
def quack():
print('quk quk..!')

uniq_duck = MallardDuck()
uniq_duck.setQuackBehavior(Quk)
uniq_duck.performQuack()
uniq_duck.performFly()

#quk quk..!
#fly

Comments