Я пытался выучить шаблон 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
В этом весь смысл шаблона декоратора. Каждый внешний класс «украшает» свой внутренний класс, добавляя или изменяя свои методы. В этом случае метод getDescription каждого класса добавляет свой метод в метод getDescription класса, который он декорирует.
Внешний декоратор сыр, его внутренний декоратор соус, который в свою очередь украшает пицца. Так когда сыр‘-> вызывается getDescription (), он вызывает соусметод getDescription (), который вызывает пиццаметод getDescription ().
Как вы можете видеть в классах sauce и cheese, метод getDescription вызывает метод get description обернутого класса перед тем, как добавить свой бит в send и вернуть его.
public function getDescription(){
return $this->pizza->getDescription() . ' and adding sauce ';
}
Вот как все методы getDescription вызываются сыр«S.
Других решений пока нет …