<?php abstract class Beverage { public $description; function getDescription(){ return $this->description; } abstract function cost(); } //这是调味料的接口(抽象装饰) abstract class CondimentDecorator extends Beverage { } //一种饮料 (被装饰者) class Espresso extends Beverage { public function __construct(){ $this->description = 'This is Espresso'; } public function cost(){ return 1.99; } } //另一种饮料(被装饰者) class HouseBlend extends Beverage { public function __construct(){ $this->description = 'This is HouseBlend'; } public function cost(){ return 3.00; } } //以下是调味料(装饰者) class Moca extends CondimentDecorator { public $beverage; //实例变量 public function __construct(Beverage $beverage){ $this->beverage = $beverage; } public function getDescription(){ return $this->beverage->getDescription().'+Mocha'; } public function cost(){ return .20+$this->beverage->cost() ; } } $a = new HouseBlend(); echo '<br />HouseBlend 详情:<br />'; echo '简介:'.$a->getDescription(); echo '<br />价格:'.$a->cost(); echo '<br />我要加些调味料:Moca <br />'; $m = new Moca($a); echo '简介:'.$k = $m->getDescription(); echo '<br />价格:'.$m->cost(); //var_dump($m); $b = new Espresso(); echo '<br />Espresso 详情:<br />'; echo '简介:'.$b->getDescription(); echo '<br />价格:'.$b->cost(); echo '<br />我要加些调味料:Moca <br />'; $m = new Moca($b); echo '简介:'.$k = $m->getDescription(); echo '<br />价格:'.$m->cost(); //var_dump($m); 要好好理解这个模式,以后写框架肯定大派用场