As i wish

[Design pattern] Decorator pattern(데코레이터 패턴) 본문

Design Pattern

[Design pattern] Decorator pattern(데코레이터 패턴)

어면태 2019. 1. 27. 23:46

오늘은 데코레이터 패턴에 대하여 알아보겠습니다.


언제나 그렇듯 일단 정의 부터 하고 가죠.


데코레이터 패턴(Decorator pattern)

데코레이터 패턴(Decorator pattern)이란 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다.


정의는 중요하지만 언제나 어려운것 같습니다.


서브클래스를 확장하지 않고 추가 되는 기능에 있어서 한 객체의 기능을 덧붙인다....라고 이해하면 쉬울것 같긴합니다만..

어렵네요 바로 다이어그램, 코드로 보시죠.





이렇게 만약 Beverage클래스만 있었다면,

우유가 들어간 에스프레소,

우유 및 크림이 들어간 에스프레소,

그냥 에스프레소,

모카가 들어간 다크로스트


등등 수많은 서브 클래스들이 생성됬겠지요.

그러나 객체를 꾸며주는 CondimentarDecorator클래스를 만들고 그에 대한 데코레이터 클래스를 만들면서

Beverage 클래스는 건드리지 않고 새롭고 각기 다른 객체들을 생성 할 수 있게 되죠,



그럼 코드로 만나 보시죠 훨씬 이해가 빠를거에요.


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
# -*- coding: utf-8 -*-
# Decorator Pattern
 
import abc
 
class Beverage:
  __metaclass__ = abc.ABCMeta
 
  def __init__(self):
    self.description = 'None'
 
  def get_description(self):
    return self.description
 
  @abc.abstractmethod
  def cost(self):
    pass
 
class CondimentDecorator(Beverage):
  __metaclass__ = abc.ABCMeta
 
  @abc.abstractmethod
  def get_description(self):
    pass
 
class Espresso(Beverage):
  def __init__(self):
    self.description = 'Espresso'
 
  def cost(self):
    return 300
 
class DarkRoast(Beverage):
  def __init__(self):
    self.description = 'DarkRoast'
 
  def cost(self):
    return 500
 
class Milk(CondimentDecorator):
  def __init__(self, beverage):
    self.beverage = beverage
 
  def get_description(self):
    return self.beverage.get_description() + ' Milk'
 
  def cost(self):
    return self.beverage.cost() + 10
 
class Cream(CondimentDecorator):
  def __init__(self, beverage):
    self.beverage = beverage
 
  def get_description(self):
    return self.beverage.get_description() + ' Cream'
 
  def cost(self):
    return self.beverage.cost() + 30
 
class Mocha(CondimentDecorator):
  def __init__(self, beverage):
    self.beverage = beverage
 
  def get_description(self):
    return self.beverage.get_description() + ' Mocha'
 
  def cost(self):
    return self.beverage.cost() + 50
 
 
print("###START####")
espresso = Espresso()
dark_roast = DarkRoast()
 
milk_espresso = Milk(espresso)
milk_mocha_espresso = Milk(Mocha(espresso))
 
cream_milk_dark_roast = Cream(Milk(dark_roast))
 
print("####COST####")
print("Milk Espresso:  %s" %milk_espresso.get_description())
print("Milk Espresso cost: %s" %milk_espresso.cost())
 
print("Milk Mocha Espresso:  %s" %milk_mocha_espresso.get_description())
print("Milk Mocha Espresso cost:  %s" %milk_mocha_espresso.cost())
 
print("Cream Milk DarkRoast:  %s" %cream_milk_dark_roast.get_description())
print("Cream Milk DarkRoast cost:  %s" %cream_milk_dark_roast.cost())
 
 
cs





Comments