Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 리액트
- Redux
- 하프가드
- 영화감상
- 자바스크립트
- Express
- 파이썬
- 개발
- 주짓떼로
- 주짓떼라
- 클로즈가드
- development
- 영화리뷰
- 개발자
- JavaScript
- REACT
- 영화
- web
- 드릴
- Node
- 웹개발
- 디자인패턴
- 엄티로드
- git
- 솔로드릴
- 주짓수
- 노드
- graphQL
- 프로그래밍
- nodejs
Archives
- Today
- Total
As i wish
[Design pattern] Decorator pattern(데코레이터 패턴) 본문
오늘은 데코레이터 패턴에 대하여 알아보겠습니다.
언제나 그렇듯 일단 정의 부터 하고 가죠.
데코레이터 패턴(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 |
'Design Pattern' 카테고리의 다른 글
[Design pattern] Singleton pattern (싱글톤 패턴) (0) | 2019.03.10 |
---|---|
[Design pattern] Abstact Factory pattern (추상 팩토리 패턴) (0) | 2019.02.17 |
[Design pattern] Factory method pattern (팩토리 메소드 패턴) (0) | 2019.02.10 |
[Design pattern] Observer pattern(옵저버 패턴) (0) | 2019.01.21 |
[Design pattern] Strategy pattern(스트래티지 패턴, 전략패턴) (0) | 2019.01.14 |
Comments