2017-01-10 61 views
0

我一直在尝试从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 

回答

0

这是装饰者模式的重点。每个外部类通过添加或修改其方法来“装饰”其内部类。在这种情况下,每个类的getDescription方法将它的一点点添加到它所装饰的类的getDescription方法中。

外装饰是奶酪,其内装饰是,这反过来装饰比萨饼。所以当奶酪' - > getDescription()被调用时,它调用的getDescription()方法,它调用披萨的getDescription()方法。

正如你可以在酱和乳酪类看到,getDescription方法增加自己的位,以发送和返回之前调用封装类的get描述方法..

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

这是怎么回事了getDescription方法由奶酪调用。

+0

感谢dbugger的回应。我仍然有点困惑。通过什么机制,所有的getDesceiption方法被调用?因为只有奶酪类的方法被明确地称为是什么使它在所有其他类中级联的?对不起,如果我很慢,只是真正热衷于比我能观察到的更详细地了解发生了什么。 – Drongo

+0

没有魔法机制,请按照代码。查看** cheese **的getDescription()方法。该方法的第一件事是什么?它调用** sauce **的getDescription方法。该方法的第一件事是什么?它调用** pizza **的getDescription方法。这可能有助于了解您是否添加日志记录。 – dbugger

+0

感谢dbugger这个便士实际上从你最后的评论中放弃了。现在看看它,我可以看到,只有在比萨饼对象getDeacription返回时,getDescription才能返回,等等......感谢您花时间澄清。 – Drongo