我一直在尝试从YouTube上的视频了解修饰器模式。我对可能是基本OOP的东西有点困惑。修饰器模式方法调用
在下面的代码中,我做了一个方法调用(见代码底部)到$ p-> getDescription();
这将返回一个由$ p = new cheese(new sauce(new plainPizza))中创建的所有类构建的连接字符串;
但是,当我运行get_class($ p)它的奶酪类。那么,对奶酪类的方法调用(即$ p-> getDescription())如何在所有类中传播?为什么不只是调用cheese类的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
感谢dbugger的回应。我仍然有点困惑。通过什么机制,所有的getDesceiption方法被调用?因为只有奶酪类的方法被明确地称为是什么使它在所有其他类中级联的?对不起,如果我很慢,只是真正热衷于比我能观察到的更详细地了解发生了什么。 – Drongo
没有魔法机制,请按照代码。查看** cheese **的getDescription()方法。该方法的第一件事是什么?它调用** sauce **的getDescription方法。该方法的第一件事是什么?它调用** pizza **的getDescription方法。这可能有助于了解您是否添加日志记录。 – dbugger
感谢dbugger这个便士实际上从你最后的评论中放弃了。现在看看它,我可以看到,只有在比萨饼对象getDeacription返回时,getDescription才能返回,等等......感谢您花时间澄清。 – Drongo