Sobes.tech
Middle

Kuidas töötab dekoratsioon PHP-s?

sobes.tech AI

Vastus AI-lt

Mustri "Dekorator" 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