Sobes.tech
Middle

Ինչպես է աշխատում դեկորատորը PHP-ում:

sobes.tech AI

Պատասխան AI-ից

"Դեկորատոր" նմուշը դինամիկ կերպով ավելացնում է նոր վարքագիծ գոյություն ունեցող օբյեկտին՝ այն պատելով այլ օբյեկտով, որը կոչվում է դեկորատոր:

  • Կոմպոնենտներ:

    • Ինտերֆեյս (Component): Հայտարարում է ընդհանուր մեթոդներ սկզբնական օբյեկտի և նրա դեկորատորների համար:
    • Կոնկրետ կոմպոնենտ (Concrete Component): Հիմնական օբյեկտը, որը պետք է դեկորատոր լինի:
    • Հիմնական դեկորատոր (Decorator): Աբստրակտ դաս կամ ինտերֆեյս, որը պարունակում է հղում ինտերֆեյսի օբյեկտին (Component) և իրականացնում է նրա մեթոդները, սովորաբար փոխանցելով կանչը այդ օբյեկտին:
    • Կոնկրետ դեկորատորներ (Concrete Decorators): Իրականացնում են նոր հնարավորություններ՝ լրացնելով կամ փոխելով հիմնական կոմպոնենտի վարքագիծը:
  • Աշխատանքի սկզբունքը:

    • Դեկորատորը պարունակում է հղում այն օբյեկտին, որը նա դեկորատոր է (կոմպոզիցիա):
    • Դեկորատորը ունի նույն ինտերֆեյսը, ինչ դեկորատոր օբյեկտը:
    • Երբ կանչում ենք մեթոդ դեկորատորում, նա կամ իրականացնում է լրացուցիչ լոգիկա առաջ կամ պատճառ համապատասխան մեթոդի կանչին դեկորատորացված օբյեկտում, կամ ամբողջությամբ փոխարինում է այն (համենայն դեպս, վերջինը սովորական չէ):
  • Առավելություններ:

    • Հնարավորություն է տալիս ավելացնել ֆունկցիոնալություն օբյեկտներին գործողության ժամանակ, ոչ թե ժառանգության միջոցով:
    • Աշխատում է "վնասված" դասակարգման հիերարխիան՝ տարբեր վարքագծերի համակցման ժամանակ:
    • Հնարավոր է ստեղծել ճկուն վարքագծերի համակցություններ:
  • Օրինակ:

<?php

// Կոմպոնենտի ինտերֆեյս
interface Coffee {
    public function getCost(): float;
    public function getDescription(): string;
}

// Կոնկրետ կոմպոնենտ
class SimpleCoffee implements Coffee {
    public function getCost(): float {
        return 5.0;
    }

    public function getDescription(): string {
        return "Պարզ կոֆե";
    }
}

// Աբստրակտ դեկորատոր
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();
    }
}

// Կոնկրետ դեկորատոր՝ ավելացնելով կաթ
class MilkDecorator extends CoffeeDecorator {
    public function getCost(): float {
        return parent::getCost() + 2.0;
    }

    public function getDescription(): string {
        return parent::getDescription() . ", կաթով";
    }
}

// Կոնկրետ դեկորատոր՝ ավելացնելով շաքար
class SugarDecorator extends CoffeeDecorator {
    public function getCost(): float {
        return parent::getCost() + 1.0;
    }

    public function getDescription(): string {
        return parent::getDescription() . ", շաքարով";
    }
}

// Օգտագործում:
// Ստեղծում ենք պարզ կոֆե
$coffee = new SimpleCoffee();
echo $coffee->getDescription() . " - " . $coffee->getCost() . "\n"; // Պարզ կոֆե - 5

// Ավելացնում ենք կաթ
$coffeeWithMilk = new MilkDecorator($coffee);
echo $coffeeWithMilk->getDescription() . " - " . $coffeeWithMilk->getCost() . "\n"; // Պարզ կոֆե, կաթով - 7

// Ավելացնում ենք շաքար
$coffeeWithMilkAndSugar = new SugarDecorator($coffeeWithMilk);
echo $coffeeWithMilkAndSugar->getDescription() . " - " . $coffeeWithMilkAndSugar->getCost() . "\n"; // Պարզ կոֆե, կաթով, շաքարով - 8