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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
 
#include<iostream>
#include<string>
class Beverage
{
protected:
    std::string name = "";
    int price = 0;
    virtual void InterfaceSeperator() = 0 {}
public:
    virtual int cost()
    {
        return this->price;
    }
    virtual std::string get_name()
    {
        return " " + name;
    }
    void set_name(std::string par)
    {
        name = par;
    }
    void set_cost(int par)
    {
        this->price = par;
    }
};
 
class Decorator : public Beverage
{
protected:
    virtual void InterfaceSeperator() = 0 {}
 
    Beverage* Decorated = nullptr;
public:
    void decorate(Beverage* par)
    {
        Decorated = par;
    }
    virtual int cost()
    {
        if (Decorated)
        {
            return this->price + Decorated->cost();
        }
        else
        {
            return this->price;
        }
    }
    virtual std::string get_name()
    {
        if (Decorated)
        {
            return " " + name + Decorated->get_name();
        }
        else
        {
            return " " + name;
        }
    }
};
 
class CaffeLatte : public Beverage
{
protected:
    virtual void InterfaceSeperator() {}
};
 
class Americano : public Beverage
{
private:
protected:
    virtual void InterfaceSeperator() {}
};
 
class Espresso : public Beverage
{
private:
    static int price;
protected:
    virtual void InterfaceSeperator() {}
};
 
class Cream : public Decorator
{
private:
    static int price;
protected:
    virtual void InterfaceSeperator() {}
};
 
class Water : public Decorator
{
 
protected:
    virtual void InterfaceSeperator() {}
};
 
class Milk : public Decorator
{
protected:
    virtual void InterfaceSeperator() {}
};
 
int main()
{
    CaffeLatte CaffeLatteVar;
    CaffeLatteVar.set_cost(30);
    CaffeLatteVar.set_name("CaffeLatte");
 
    Milk MilkVar;
    MilkVar.set_name("Milk");
    MilkVar.set_cost(300);
 
    Water WaterVar;
    WaterVar.set_cost(500);
    WaterVar.set_name("Water");
    MilkVar.decorate(&CaffeLatteVar);
    std::cout << MilkVar.cost() << std::endl;
    std::cout << MilkVar.get_name() << std::endl;
 
    WaterVar.decorate(&MilkVar);
    std::cout << WaterVar.cost() << std::endl;
    std::cout << WaterVar.get_name() << std::endl;
 
    Cream CreamVar;
    CreamVar.set_cost(500);
    CreamVar.set_name("Cream");
    std::cout << CreamVar.cost() << std::endl;
    std::cout << CreamVar.get_name() << std::endl;
    
    CreamVar.decorate(&MilkVar);
    std::cout << CreamVar.cost() << std::endl;
    std::cout << CreamVar.get_name() << std::endl;
}
cs

이걸 응용해서 메뉴 프로그램을 만드려보려고 시도했으나..

별로 흥미는 없는데 구상하다보니 끝도 없이 프로그램이 커지는 바람에 결국 실패로 끝났다.

괜히 시간만 날린 것 같다. 

앞으로 프로그램을 만들 땐 내가 만들 수 있는 것으로 처음부터 철저하게 구상해놔야 할 것 같다.

+ Recent posts