Head First Design Pattern 에 소개되는 예제를 파이썬으로 구현하였습니다.
데코레이터 패턴(Decorator 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
| from abc import ABCMeta, abstractmethod
class Beverage(metaclass=ABCMeta): def __init__(self): self.description = None def getDescription(self): return self.description @abstractmethod def cost(self): pass
class CondimentDecorator(Beverage): pass
class Espresso(Beverage): def __init__(self): self.description = "Espresso" def cost(self): return 1.99 class HouseBlend(Beverage): def __init__(self): self.description = "Houser blend" def cost(self): return .89 class Mocha(CondimentDecorator): def __init__(self, beverage): self.beverage = beverage def getDescription(self): return self.beverage.getDescription() + ", 모카" def cost(self): return .20 + self.beverage.cost() class Cream(CondimentDecorator): def __init__(self, beverage): self.beverage = beverage def getDescription(self): return self.beverage.getDescription() + ", 크림" def cost(self): return .70 + self.beverage.cost()
|
테스트
음료에 크림과 모카 추가하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| beverage = Espresso() beverage = Mocha(beverage)
print("Beverage is " + beverage.getDescription() + " cost is " + str(beverage.cost()))
beverage2 = HouseBlend() beverage2 = Mocha(beverage2) beverage2 = Cream(beverage2) print("Beverage is " + beverage2.getDescription() + " cost is " + str(beverage2.cost()))
|