Sobes.tech
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