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
| 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()
doll = DuckDoll() doll.performQuack() doll.performFly() doll.display() doll.battery()
|
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()
|