1. 程式人生 > >php設計模式之:裝飾者模式

php設計模式之:裝飾者模式

decorator tac coff cti cor ring 咖啡 parent namespace

Beverage.php

<?php
namespace DesignPattern;

abstract class Beverage
{
    /**
     * @var string
     */
    protected $name = ‘‘;

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name
     * @return Beverage
     */
    public function setName(string $name): Beverage
    {
        $this->name = $name;
        return $this;
    }

    /**
     * @return float
     */
    public abstract function getCost(): float;

    /**
     * Beverage constructor.
     */
    public function __construct()
    {
    }
}

BlueMountainCoffee.php

<?php

namespace DesignPattern;
/**
 * 藍山咖啡
 */
class BlueMountainCoffee extends Beverage
{

    /**
     * @return float
     */
    public function getCost(): float
    {
        return 18.0;
    }
}

CubitaCoffee.php

<?php

namespace DesignPattern;
/**
 * 琥爵咖啡
 */
class CubitaCoffee extends Beverage
{

    /**
     * @return float
     */
    public function getCost(): float
    {
        return 24.0;
    }
}

CoffeeDecorator.php

<?php

namespace DesignPattern;

abstract class CoffeeDecorator extends Beverage
{
    /**
     * @var CoffeeDecorator
     */
    protected $coffeeDecorator;

    /**
     * CoffeeDecorator constructor.
     * @param Beverage $coffeeDecorator
     */
    public function __construct(Beverage $coffeeDecorator)//特別需要註意這個地方,裝飾者模式必須允許對裝飾後的對象再次裝飾
    {
        parent::__construct();
        $this->coffeeDecorator = $coffeeDecorator;
    }
}

MilkDecorator.php

<?php

namespace DesignPattern;

class MilkDecorator extends CoffeeDecorator
{
    /**
     * @return float
     */
    public function getCost(): float
    {
        return $this->coffeeDecorator->getCost() + 2.5;
    }
}

SugarDecorator.php

<?php

namespace DesignPattern;

class SugarDecorator extends CoffeeDecorator
{

    /**
     * @return float
     */
    public function getCost(): float
    {
        return $this->coffeeDecorator->getCost() + 1.2;
    }
}

最終調用:

$coffee = new \DesignPattern\BlueMountainCoffee();//生成一杯藍山咖啡
$beverage = new \DesignPattern\MilkDecorator($coffee);//給藍山咖啡加一份牛奶
$beverage = new \DesignPattern\MilkDecorator($beverage);//給藍山咖啡再加一份牛奶
$beverage = new \DesignPattern\SugarDecorator($beverage);//給藍山咖啡加一份糖
$beverage = new \DesignPattern\SugarDecorator($beverage);//給藍山咖啡再加一份糖
$beverage = new \DesignPattern\SugarDecorator($beverage);//給藍山咖啡再加一份糖
var_dump($beverage->getCost());

程序運行結果:

float(26.6)

php設計模式之:裝飾者模式