Middle
PHPda dekorator qanday ishlaydi?
sobes.tech AI
AIdan javob
"Dekorator" naqshiri mavjud ob'ektga dinamik tarzda yangi xususiyat qo'shadi, uni boshqa ob'ekt bilan, dekorator deb nomlangan bilan o'rab, amalga oshiradi.
-
Tarkibiy qismlar:
- Interfeys (Component): Asl ob'ekt va uning dekoratorlari uchun umumiy metodlarni e'lon qiladi.
- Aniq Tarkibiy (Concrete Component): Dekoratsiya qilish uchun asosiy ob'ekt.
- Asosiy Dekorator (Decorator): Interfeys (Component) ob'ektiga havola bo'lgan va uning metodlarini amalga oshiradigan abstrakt sinf yoki interfeys, odatda bu ob'ektga chaqiruvni delegatsiya qiladi.
- Aniq Dekoratorlar (Concrete Decorators): Yangi imkoniyatlarni amalga oshiradi, yoki asosiy komponentning xulq-atvorini to'ldiradi yoki o'zgartiradi.
-
Ishlash prinsipi:
- Dekorator o'zida dekoratsiya qilayotgan ob'ektga havola (kompozitsiya orqali) saqlaydi.
- Ushbu dekorator xuddi shunday interfeysga ega, ya'ni u dekoratsiya qilinayotgan ob'ekt bilan bir xil interfeysga ega.
- Dekoratordagi metod chaqirilganda, u qo'shimcha mantiqni oldin yoki keyin bajaradi yoki to'liq o'rnini bosadi (so'nggi, bu odatiy foydalanish emas).
-
Afzalliklar:
- Ob'ektlarga __ish vaqti__da funksionallik qo'shishga imkon beradi, statik merosdan emas.
- Bir nechta turli xulq-atvorlarni birlashtirishda sinf hierarxiyasining portlashi oldini oladi.
- Moslashuvchan xulq-atvor kombinatsiyalarini yaratishga imkon beradi.
-
Misol:
<?php
// Tarkibiy qismlar interfeysi
interface Coffee {
public function getCost(): float;
public function getDescription(): string;
}
// Aniq tarkibiy
class SimpleCoffee implements Coffee {
public function getCost(): float {
return 5.0;
}
public function getDescription(): string {
return "Oddiy qahva";
}
}
// Asosiy dekorator
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();
}
}
// Aniq dekorator: Sut qo'shish
class MilkDecorator extends CoffeeDecorator {
public function getCost(): float {
return parent::getCost() + 2.0;
}
public function getDescription(): string {
return parent::getDescription() . ", sut bilan";
}
}
// Aniq dekorator: Shakar qo'shish
class SugarDecorator extends CoffeeDecorator {
public function getCost(): float {
return parent::getCost() + 1.0;
}
public function getDescription(): string {
return parent::getDescription() . ", shakar bilan";
}
}
// Foydalanish:
// Oddiy qahva yaratish
$coffee = new SimpleCoffee();
echo $coffee->getDescription() . " - " . $coffee->getCost() . "\n"; // Oddiy qahva - 5
// Sut qo'shish
$coffeeWithMilk = new MilkDecorator($coffee);
echo $coffeeWithMilk->getDescription() . " - " . $coffeeWithMilk->getCost() . "\n"; // Oddiy qahva, sut bilan - 7
// Shakar qo'shish
$coffeeWithMilkAndSugar = new SugarDecorator($coffeeWithMilk);
echo $coffeeWithMilkAndSugar->getDescription() . " - " . $coffeeWithMilkAndSugar->getCost() . "\n"; // Oddiy qahva, sut bilan, shakar bilan - 8