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