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