Wzorzec dekorator

<?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());
Komentarze wyłączone