내배캠/C++

디자인 패턴(Decorator Pattern)

동그래님 2024. 12. 30. 17:27
#include <iostream>
#include <string>

using namespace std;

class Pizza
{
public:
    virtual ~Pizza() {}
    virtual string GetName() const = 0;
    virtual double GetPrice() const = 0;
};

class BasicPizza : public Pizza
{
public:
    string GetName() const override
    {
        return "Basic Pizza";
    }
    double GetPrice() const override
    {
        return 5.0;
    }
};

class PizzaDecorator : public Pizza
{
protected:
    Pizza* pizza;

public:
    PizzaDecorator(Pizza* p) : pizza(p) {}

    virtual ~PizzaDecorator()
    {
        delete pizza;
    }
};

class CheeseDecorator : public PizzaDecorator
{
public:
    CheeseDecorator(Pizza* p) : PizzaDecorator(p) {}
    string GetName() const override
    {
        return pizza->GetName() + " + Cheese";
    }
    double GetPrice() const override
    {
        return pizza->GetPrice() + 1.5;
    }
};

class OliveDecorator : public PizzaDecorator
{
public:
    OliveDecorator(Pizza* p) : PizzaDecorator(p) {}
    string GetName() const override
    {
        return pizza->GetName() + " + Olive";
    }
    double GetPrice() const override
    {
        return pizza->GetPrice() + 0.5;
    }
};

int main() 
{
    Pizza* pizza = new BasicPizza();

    pizza = new CheeseDecorator(pizza);
    pizza = new OliveDecorator(pizza);

    cout << pizza->GetName() << " : " << pizza->GetPrice();


    delete pizza;

    return 0;
}

 

 

  • 객체의 기능을 동적으로 확장하거나 변경할 수 있도록 설계된 구조적 디자인 패턴이다.
  • 새로운 클래스를 정의하지 않고도 객체의 행동을 동적으로 추가하거나 수정할 수 있다.
  • 객체를 기본 객체와 데코레이터 객체로 분리하고, 데코레이터 객체가 기본 객체를 감싸면서 추가적인 기능을 제공한다.
  • 중첩된 데코레이터를 통해 복잡한 동작을 조합할 수 있지만, 과도한 중첩은 코드의 복잡성을 증가시키고 객체의 최종 동작을 추적하는 것이 어려울 수 있다.