PHP中的装饰器设计模式实例

105 阅读1分钟

装饰器设计模式用于动态地将新功能添加到现有的类实例中。在下面的例子中,我们将出售一辆奔驰汽车,但会在其中添加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