装饰器模式方法调用

时间:2017-01-10 23:54:11

标签: php oop decorator

我一直在努力学习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

1 个答案:

答案 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方法的调用方法。

相关问题