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