[디자인패턴] 데코레이터 패턴 with python


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()))

#Beverage is Espresso, 모카 cost is 2.19
#Beverage is Houser blend, 모카, 크림 cost is 1.79

Comments