装饰器类的作用:不使用继承,也能是对象使用新方法。重点是类实例化出来的对象。
装饰器类(配菜类)也必须继承food类,否则就不是装饰器类了(嗯!就是这样)
装饰器: 手抓饼实现。
1:food抽象类 -》cake类
2:food抽象类-》peicai抽象类 -》各种配菜类(有新方法)
3:实例化cake类($obj) 将$obj(旧)注入到配菜类中,赋值给对象$obj(新),则既能使用$obj(旧)中的方法 又能使用$obj(新)的方法
<?php
header("Content-type: text/html; charset=utf-8");
//定义一个Food抽象类。
abstract class Food{
abstract function getFood();
abstract function price();
}
//饼,继承自Food类,
class cake extends Food{
function getFood(){
return '这是一份美味的手抓饼';
}
function price(){
return 4;
}
}
//配菜也继承自Food类,这是装饰器模式的格式。
abstract class peicai extends Food{
public $food = null;
function __construct(Food $food){
$this->food = $food;
}
}
class egg extends peicai{
function getFood(){
//第二个重点在这里,用到新的方法,在不继承的情况下增加新方法。
return $this->food->getFood()."加上".$this->shell().'的鸡蛋';
}
function price(){
return $this->food->price()+2;
}
function shell(){
return '剥掉蛋壳';
}
}
$a = new cake;
//ECHO $a->getFood().'<BR>';
$b = new egg($a);
echo $b->getFood().'<BR>';
echo $b->price();