<?php
interface CarInterface {
public function calcualtePrice(): int;
}
abstract class CarDecorator implements CarInterface {
protected $car;
public function __construct(CarInterface $car) {
$this->car = $car;
}
}
Class Car implements CarInterface {
public function calcualtePrice(): int {
return 5000;
}
}
Class CarWithAirConditioning extends CarDecorator {
public function calcualtePrice(): int {
return $this->car->calcualtePrice() + 101;
}
}
Class CarWithSunRoof extends CarDecorator {
public function calcualtePrice(): int {
return $this->car->calcualtePrice() + 70;
}
}
Class CarWith5Skin extends CarDecorator {
public function calcualtePrice(): int {
return $this->car->calcualtePrice() + 111;
}
}
Class CarWithCamera extends CarDecorator {
public function calcualtePrice(): int {
return $this->car->calcualtePrice() + 52;
}
}
$car1 = new CarWithCamera(new CarWithAirConditioning(new Car()));
var_dump($car1->calcualtePrice());
$car2 = new CarWithAirConditioning(new CarWith5Skin(new Car()));
var_dump($car2->calcualtePrice());
$car3 = new Car();
$car3 = new CarWithAirConditioning($car3);
$car3 = new CarWithSunRoof($car3);
$car3 = new CarWith5Skin($car3);
$car3 = new CarWithCamera($car3);
var_dump($car3->calcualtePrice());