Вызов метода шаблона Decorator

Я пытался выучить шаблон Decorator из видео на YouTube. Я немного смущен чем-то, что, вероятно, элементарно ООП.

В приведенном ниже коде я делаю один вызов метода (см. Нижнюю часть кода) для $ p-> getDescription ();

Это возвращает объединенную строку, созданную из всех классов, созданных в $ p = new cheese (new sauce (new plainPizza));

Но когда я запускаю get_class ($ p), это класс сыра. Так как же вызов метода для класса cheese (то есть $ p-> getDescription ()) распространяется на все классы? Почему он просто не вызывает метод getDescription класса сыра?

<?php

interface Pizza{

public function getDescription();
public function getCost();
}class plainPizza implements Pizza{

public function getDescription(){
return 'Thin dough ';
}

public function getCost(){
return 4;
}
}

abstract class ToppingDecorator implements Pizza{

protected $pizza;

public function __construct(Pizza $pizza){
$this->pizza = $pizza;
}
}

class cheese extends ToppingDecorator{

public function __construct(Pizza $pizza){
parent::__construct($pizza);
}

public function getDescription(){
return $this->pizza->getDescription() . ' and adding cheeeeeese!';

}

public function getCost(){
return $this->pizza->getCost() + 0.55;
}

}class sauce extends ToppingDecorator{

public function __construct(Pizza $pizza){
parent::__construct($pizza);
}

public function getDescription(){
return $this->pizza->getDescription() . ' and adding sauce ';
}

public function getCost(){
return $this->pizza->getCost() + 1.25;
}

}$p = new cheese(new sauce(new plainPizza));

echo '<br>';
echo $p->getDescription(); //return Thin dough and adding sauce and adding cheeeeeese!
echo '<br>';
echo get_class($p); //return cheese

0

Решение

В этом весь смысл шаблона декоратора. Каждый внешний класс «украшает» свой внутренний класс, добавляя или изменяя свои методы. В этом случае метод getDescription каждого класса добавляет свой метод в метод getDescription класса, который он декорирует.

Внешний декоратор сыр, его внутренний декоратор соус, который в свою очередь украшает пицца. Так когда сыр‘-> вызывается getDescription (), он вызывает соусметод getDescription (), который вызывает пиццаметод getDescription ().

Как вы можете видеть в классах sauce и cheese, метод getDescription вызывает метод get description обернутого класса перед тем, как добавить свой бит в send и вернуть его.

 public function getDescription(){
return $this->pizza->getDescription() . ' and adding sauce ';
}

Вот как все методы getDescription вызываются сыр«S.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]