Basic/Design Pattern

#6 Decorator Pattern in C++ (데코레이터 패턴 C++)

VallistA2016. 3. 30. 12:02


그림 1 : 데코레이터 패턴 예시 (사진 = Dean's Blog)



데코레이터 패턴


커피를 만드는데, 우리는 어떻게 만드는가? 먼저, 카페베네 같은곳을 갔다고 하자. 카라멜 마끼아또를 시키는데 이 커피는 뭐가 들어가나 생각을 해보자.

정리를 해보면 커피, 카라멜시럽, 컵, 등등이 있을 것이다. 그러한 것들에 대해서 소스코드를 짠다고 생각해보자.


아메리카노일반컵이란 클래스가 있으면

아메라카노큰컵이란 클래스도 있을 것이고

아메리카노큰컵에프림조금 클래스도 있을 것이고.

프림 많이 넣은 클래스도 있을 것이다.


이렇게 되면 클래스가 너무 많아지기때문에 관리도 힘들다. 그러므로 우리는 생각해 낸 것이다. 커피와 동등 선상에 있는 데코레이터를 하나 만들어서 같이 가지고 있으면 되지 않냐는 생각에 말이다.



소스코드



그림 2 : 구현한 데코레이터, 부대찌개를 예로 들었다.


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
#include <iostream>
 
using std::cout;
using std::endl;
using std::string;
 
// 부대찌개 인터페이스
class 부대찌개인터페이스
{
public:
    virtual int 가격() = 0;
    virtual string 재료() = 0;
};
 
// 부대찌개 베이스 클래스
class 부대찌개 : public 부대찌개인터페이스
{
public:
    int 가격() { return 6000; }
    string 재료() { return "부대찌개"; }
};
 
class 부대찌개데코레이터 : public 부대찌개인터페이스
{
public:
    부대찌개데코레이터(부대찌개인터페이스* 부대찌개컴포넌트) : 부대찌개컴포넌트(부대찌개컴포넌트) {}
    ~부대찌개데코레이터() { if (부대찌개컴포넌트) delete 부대찌개컴포넌트; }
 
public:
    int 가격() { if (부대찌개컴포넌트) return 부대찌개컴포넌트->가격(); else return 0; }
    string 재료() { if (부대찌개컴포넌트) return 부대찌개컴포넌트->재료(); else return ""; }
 
private:
    부대찌개인터페이스* 부대찌개컴포넌트;
};
 
class 참치부대찌개 : public 부대찌개데코레이터
{
public:
    참치부대찌개(부대찌개인터페이스* 부대찌개컴포넌트) : 부대찌개데코레이터(부대찌개컴포넌트) {}
 
public:
    int 가격() { return 부대찌개데코레이터::가격() + 1000; }
    string 재료() { return "참치  + " + 부대찌개데코레이터::재료(); }
};
 
class 만두부대찌개 : public 부대찌개데코레이터
{
public:
    만두부대찌개(부대찌개인터페이스* 부대찌개컴포넌트) : 부대찌개데코레이터(부대찌개컴포넌트) {}
 
public:
    int 가격() { return 부대찌개데코레이터::가격() + 2000; }
    string 재료() { return "만두  + " + 부대찌개데코레이터::재료(); }
};
 
void main()
{
    부대찌개인터페이스 * 부대찌개컴포넌트 = new 만두부대찌개(new 참치부대찌개(new 부대찌개데코레이터(new 부대찌개)));
 
    cout << "가격 : " << 부대찌개컴포넌트->가격() << endl;
    cout << "재료 : " << 부대찌개컴포넌트->재료().c_str() << endl;
    delete 부대찌개컴포넌트;
 
    system("pause");
}


댓글

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!

자고 싶습니다. ㅠㅠ

Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today :

Total :

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment