Как в декорируемом объекте использовать метод измененный в декораторе?

Приведу простой пример:
Есть класс Coffee, с методами getCost и getCheck().
Метод getCheck выглядит как-то так: return "Цена заказа: " . $this->getCost();
Есть множество декораторов вида WithMilk, WithSugar и тд.
Например метод getCost() класс Coffee: return 100;.
Метод getCost() класса WithMilk return $this->coffee->getCost() + 50;. Метод getCost() класса WithSugar return $this->coffee->getCost() + 10;. Метод getCheck во всех декораторах: return $this->coffee->getCheck(); Вот такой клиентский код:

$offer = new WithMilk(new WithSugar(new Coffee()));
echo $offer->getCheck();
echo $offer->getCost();

Такой код возвращает строку "Цена заказа: 100", а хотелось бы "Цена заказа 160".
Но метод getCost() отрабатывает верно. Показывает 160.
Выходит так, что метод getCheck() внутри себя использует метод getPrice() декорируемого объекта.
Дублировать код метода getCheck() внутри декораторов тоже не вариант, т.к. getCheck может отличаться у дукорируемых объектов.

Может быть я не к месту применяю Декоратор? Но создавать кучу классов вида CoffeeWithMilkAndWithSugar тоже не хочу.
Как мне решить эту проблему?


Ответы (0 шт):