Decorator_Pattern - 8BitsCoding/RobotMentor GitHub Wiki

์ •์˜

๋™์ ์œผ๋กœ ์ฑ…์ž„ ์ถ”๊ฐ€๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


์˜ˆ์‹œ๋กœ ์„ค๋ช…

์˜ˆ์ œ - ์ปคํ”ผ ์ œ์กฐ ๋ฐฉ๋ฒ•

์ปคํ”ผ์˜ ๊ฐ’์„ ์ธก์ •ํ•˜๊ณ  ์‹ถ๋‹ค.

์—์Šคํ”„๋ ˆ์†Œ : ์ปคํ”ผ์˜ ๊ธฐ๋ณธ ์•„๋ฉ”๋ฆฌ์นด๋…ธ : ์—์Šคํ”„๋ ˆ์†Œ + ๋ฌผ ์นดํŽ˜๋ผ๋–ผ : ์—์Šคํ”„๋ ˆ์†Œ + ์ŠคํŒ€๋ฐ€ํฌ ํ—ค์ด์ฆ๋„› : ์•„๋ฉ”๋ฆฌ์นด๋…ธ + ํ—ค์ด์ฆ๋„› ์‹œ๋Ÿฝ ์นดํŽ˜๋ชจ์นด : ์นดํŽ˜๋ผ๋–ผ + ์ดˆ์ฝ”๋ฆฟ ์บฌ๋ผ๋ฉœ ๋งˆ๋ผ์•„๋˜ : ์นดํŽ˜๋ผ๋–ผ + ์นด๋ผ๋ฉœ ์‹œ๋Ÿฝ

void main() {
    Scanner * sc = new Scanner();   // ์‚ฌ์šฉ์ž input์„ ๋ฐ›์Œ

    IBeverage * beverage = new Base();
    bool done = false;

    while(!done) {
        printf("ํ˜„์žฌ ์Œ๋ฃŒ์˜ ๊ฐ€๊ฒฉ : %d", beverage->getTotalPrice());
        printf("์„ ํƒ : 1 ์ƒท ์ถ”๊ฐ€ / 2 ์šฐ์œ  ์ถ”๊ฐ€");
        switch(sc->input()) {
        case 0:
            done = true;
            break;
        case 1:
            beverage = new Espresso(beverage);
            break;
        case 2:
            beverage = new Milk(beverage);
            break;
        default:
            break;
        }
    }
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ ์˜ค๋ธŒ์ ํŠธ์— ์ง€์†์ ์œผ๋กœ ๋ฉ”๋‰ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค.

class IBeverage {
public:
    virtual int getTotalPrice();
};
class AbstAdding : public IBeverage {
private:
    IBeverage* base;
public:
    AbstAdding(IBeverage* _base) { this->base = _base; }
    int getTotalPrice() {
        return base->getTotalPrice();
    }
protected:
    IBeverage* getBase() {
        return base;
    }
};
class Espresso : public AbstAdding {
protected:
    int espressoCount = 0;
public:
    Espresso(IBeverage * base) : AbstAdding(base) {}
private:
    int getAddPrice() {
        espressoCount += 1;
        int addPrice = 100;
        if(espressoCount > 1) {
            addPrice = 70;
        }
        return addPrice;
    }
};
class Milk : public AbstAdding {
public:
    Milk(IBeverage* material) : AbstAdding(material) {}
};

์ฐธ๊ณ ์‚ฌ์ดํŠธ