我一直在努力学习YouTube上视频的Decorator模式。我对某些可能是基本的OOP感到困惑。
在下面的代码中,我将一个方法调用(参见代码底部)调用到$ p-> getDescription();
这将返回一个由$ p = new cheese(new sauce(new plainPizza))中创建的所有类构建的串联字符串;
但是当我运行get_class($ p)它的奶酪类时。那么一个方法调用干酪类(即$ 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 :(得分:0)
这是装饰者模式的重点。每个外层&#34;装饰&#34;它的内部类通过添加或修改其方法。在这个例子中,每个类的getDescription方法将它的一点点添加到它所装饰的类的getDescription方法中。
外部装饰者是奶酪,它的内部装饰者是酱汁,它反过来装饰披萨。因此,当调用 cheese &#39; - &gt; getDescription()时,它会调用 sauce 的getDescription()方法,该方法调用 pizza &#39; getDescription()方法。
正如你在酱和奶酪类中看到的那样,getDescription方法在将自己的位添加到发送并返回之前调用包装类的get描述方法。
public function getDescription(){
return $this->pizza->getDescription() . ' and adding sauce ';
}
这就是 cheese 所有getDescription方法的调用方法。