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