Паттерн Декоратор

Помогите пожалуйста разобраться. Есть приложение, которое создает пиццу с произвольным набором компонентов. Приложение написано при помощи паттерна декоратор. Как реализовать возможность подсчета общей стоимости пиццы? Вроде похоже на то, что это не сложно, но не соображу с чего начать.

Так и где приложение?)

#include<iostream>

using namespace std;
class Pizza
{
public:
	virtual double bill() = 0;
	virtual ~Pizza() = default;
};

class SmallPizza:public Pizza
{
	double price1 = 0;
public:
	double getSmallPizzaPrice()const
	{
		return price1;
	}
	void setSmallPizzaPrice(double _price1)
	{
		price1 = _price1;
	}
	double bill()override
	{
		cout << price1 << endl;
	}
};

class MediumPizza:public Pizza
{
	double price2 = 0;
public:
	double getMediumPizzaPrice()const
	{
		return price2;
	}
	void setMediumPizzaPrice(double _price2)
	{
		price2 = _price2;
	}
};

class Decorator:public Pizza
{
protected:
	Pizza* component = nullptr;
public:
	Decorator(Pizza* component)
	{
	  this->component = component;
	}
	~Decorator()override
	{
		delete component;
	}
};

class WithCheese: public Decorator
{
	double price3 = 0;
public:
	WithCheese(Pizza* c) :Decorator(c)
	{
	}

};

class WithOlives: public Decorator
{
	double price4 = 0;
public:
	WithOlives(Pizza* c) :Decorator(c)
	{
	}
};

class WithSalami: public Decorator
{
	double price5 = 0;
public:
	WithSalami(Pizza* c) :Decorator(c)
	{
	}
};

int main()
{

}

Ну я его начал делать, точнее сказать. Но не могу понять как реализовать подсчет общей суммы?)

Тут вместо cout, естественно return price. Не пойму, как это потом в кучу собрать?

А про пиццу какая задача была? Тут что-то странное и непонятно для чего декоратор нужен был.

https://refactoring.guru/design-patterns/decorator

Вот условие. Задачу нужно реализовать при помощи паттерна Декоратор.

Спроектировать приложение, которое позволяет создавать пиццу с произвольным
количеством ингредиентов. Предусмотреть два вида основ для пиццы(например
маленькая и средняя) а так же, как минимум, три вида ингредиентов. Реализовать
возможность подсчета общей стоимости пиццы со всеми включенными
ингредиентами.

Я так понимаю нужно сделать метод, в котором будет вестись подсчет ингредиентов. Этот метод должен возвращать значение суммы. Как реализовать все таким образом, чтобы при добавлении ингредиента, он прибавлялся бы к сумме уже существующих?

Тогда это можно сделать почти прямо как в примере по ссылке выше.

В базовом классе/интерфейсе сделать функцию типа getPrice, в SmallPizza и MediumPizza возвращать оттуда какое-то число.
Тут примерно так и есть, только не надо отдельные функции цен у каждого класса. И вместо setPrice можно в конструкторе цену принимать или вообще просто константа.

А для ингредиентов создать декораторы и там в getPrice:

return price + pizza.getPrice();

где price — цена ингредиента.

и в main:

Pizza* pizza;
if (pizzaSize == "small") {
    pizza = new SmallPizza();
} else {
    pizza = new MediumPizza();
}

if (olives) {
    pizza = new OlivePizzaDecorator(pizza);
}
if (salami) {
    pizza = new SalamiPizzaDecorator(pizza);
}
1 лайк