Middle
Kā darbojas dekorators PHP?
sobes.tech AI
Atbilde no AI
Patrons "Dekorators" dinamiski pievieno jaunu uzvedību esošajam objektam, apvijot to ar citu objektu, ko sauc par dekoratoru.
-
Komponenti:
- Interfeiss (Component): Nosaka kopējas metodes sākotnējajam objektam un tā dekoratoriem.
- Konkrētais Komponents (Concrete Component): Galvenais objekts, kuru nepieciešams dekorēt.
- Bāzes Dekorators (Decorator): Abstrakts klases vai interfeisa, kas satur atsauci uz interfeisa objektu (Component) un īsteno tā metodes, parasti deleģējot izsaukumu šim objektam.
- Konkrētie Dekoratori (Concrete Decorators): īsteno jaunas iespējas, papildinot vai mainot pamata komponenta uzvedību.
-
Darba princips:
- Dekorators ietver atsauci uz objektu, ko tas dekorē (kompozīcija).
- Dekorators būtībā ir tāds pats interfeiss, kā dekorējamais objekts.
- Izsaucot metodi dekoratorā, tas vai nu veic papildu loģiku pirms vai pēc attiecīgās metodes izsaukuma dekorējamajā objektā, vai to pilnībā aizstāj (lai gan pēdējais nav tipisks izmantošanas veids).
-
Priekšrocības:
- Ļauj pievienot funkcionalitāti objektiem izpildes laikā, nevis statiskā mantošanas veidā.
- Novērš "bumbu" un hierarhijas eksploziju, apvienojot dažādas uzvedības.
- Ļauj veidot elastīgas uzvedības kombinācijas.
-
Piemērs:
// Interfeiss Komponentam
interface Coffee {
public function getCost(): float;
public function getDescription(): string;
}
// Konkrētais Komponents
class SimpleCoffee implements Coffee {
public function getCost(): float {
return 5.0;
}
public function getDescription(): string {
return "Parasts kafija";
}
}
// Bāzes Dekorators
abstract class CoffeeDecorator implements Coffee {
protected Coffee $coffee;
public function __construct(Coffee $coffee) {
$this->coffee = $coffee;
}
public function getCost(): float {
return $this->coffee->getCost();
}
public function getDescription(): string {
return $this->coffee->getDescription();
}
}
// Konkrētais Dekorators: Piens
class MilkDecorator extends CoffeeDecorator {
public function getCost(): float {
return parent::getCost() + 2.0;
}
public function getDescription(): string {
return parent::getDescription() . ", ar pienu";
}
}
// Konkrētais Dekorators: Cukurs
class SugarDecorator extends CoffeeDecorator {
public function getCost(): float {
return parent::getCost() + 1.0;
}
public function getDescription(): string {
return parent::getDescription() . ", ar cukuru";
}
}
// Lietošana:
// Izveido parastu kafiju
$coffee = new SimpleCoffee();
echo $coffee->getDescription() . " - " . $coffee->getCost() . "\n"; // Parasta kafija - 5
// Pievieno pienu
$coffeeWithMilk = new MilkDecorator($coffee);
echo $coffeeWithMilk->getDescription() . " - " . $coffeeWithMilk->getCost() . "\n"; // Parasta kafija, ar pienu - 7
// Pievieno arī cukuru
$coffeeWithMilkAndSugar = new SugarDecorator($coffeeWithMilk);
echo $coffeeWithMilkAndSugar->getDescription() . " - " . $coffeeWithMilkAndSugar->getCost() . "\n"; // Parasta kafija, ar pienu, ar cukuru - 8