#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;
}
- 객체의 기능을 동적으로 확장하거나 변경할 수 있도록 설계된 구조적 디자인 패턴이다.
- 새로운 클래스를 정의하지 않고도 객체의 행동을 동적으로 추가하거나 수정할 수 있다.
- 객체를 기본 객체와 데코레이터 객체로 분리하고, 데코레이터 객체가 기본 객체를 감싸면서 추가적인 기능을 제공한다.
- 중첩된 데코레이터를 통해 복잡한 동작을 조합할 수 있지만, 과도한 중첩은 코드의 복잡성을 증가시키고 객체의 최종 동작을 추적하는 것이 어려울 수 있다.
'내배캠 > C++' 카테고리의 다른 글
std::regex_replace (0) | 2024.12.31 |
---|---|
디자인 패턴(Observer Pattern) (1) | 2024.12.30 |
디자인 패턴(Singleton Pattern) (0) | 2024.12.30 |
std::toupper / std::tolower (0) | 2024.12.30 |
비트 연산자 (0) | 2024.12.30 |