装饰器设计模式用于动态地将新功能添加到现有的类实例中。在下面的例子中,我们将出售一辆奔驰汽车,但会在其中添加tiptronic变速器和真皮座椅。
类
MercedesSaleInterface
interface MercedesSaleInterface
{
public function calculatePrice(): float;
public function getDescription(): string;
}
奔驰销售
class MercedesSale implements MercedesSaleInterface
{
public function calculatePrice(): float
{
return 20000.96;
}
public function getDescription(): string
{
return 'Mercedes';
}
}
汽车销售装饰器
abstract class CarSaleDecorator implements MercedesSaleInterface
{
protected $mercedesSale;
public function __construct(MercedesSaleInterface $mercedesSale)
{
$this->mercedesSale = $mercedesSale;
}
}
尖端技术
class Tiptronic extends CarSaleDecorator
{
public function calculatePrice(): float
{
return $this->mercedesSale->calculatePrice() + 1000.01;
}
public function getDescription(): string
{
return $this->mercedesSale->getDescription() . ' with tiptronic transmission';
}
}
皮椅
class LeatherSeat extends CarSaleDecorator
{
public function calculatePrice(): float
{
return $this->mercedesSale->calculatePrice() + 100.02;
}
public function getDescription(): string
{
return $this->mercedesSale->getDescription() . ' with leather seats';
}
}
使用方法
$mercedesSale = new MercedesSale();
echo $mercedesSale->calculatePrice().PHP_EOL;
echo $mercedesSale->getDescription().PHP_EOL;
$mercedesSale = new Tiptronic($mercedesSale);
echo $mercedesSale->calculatePrice().PHP_EOL;
echo $mercedesSale->getDescription().PHP_EOL;
$mercedesSale = new LeatherSeat($mercedesSale);
echo $mercedesSale->calculatePrice().PHP_EOL;
echo $mercedesSale->getDescription().PHP_EOL;
结果
20000.96
Mercedes
21000.97
Mercedes with tiptronic transmission
21100.99
Mercedes with tiptronic transmission with leather seats