09/01/2019 - PHP
Decorator tasarım deseni, bir classın mevcut olan işlevine dinamik olarak yeni işlevlik eklemeye yarar. Bu işlem yapılırken mevcut olan class herhangi bir şekilde değişikliğe uğramaz. Aşağıdaki örnekte, Mercedes marka bir araç satacağız ama mevcut olan özelliklerine ekstradan tiptronik vites ve deri koltuklar ekleyeceğiz.
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