php設計模式之:裝飾者模式
阿新 • • 發佈:2018-07-04
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設計模式之:裝飾者模式