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