Sobes.tech
Middle

Dekorator (Decorator) nima?

sobes.tech AI

AIdan javob

Dekorator — bu strukturaviy shablon bo‘lib, u obyekti dinamik tarzda yangi funksiyalarni qo‘shishga imkon beradi, uning tuzilmasini o‘zgartirmasdan. U obyekti o‘rab oladi, shuningdek, o‘sha obyekti bilan bir xil interfeysni taqdim etadi, lekin uning xulq-atvorini qo‘shadi yoki o‘zgartiradi.

Asosiy elementlar:

  • Komponent (Component): O‘ralgan ob’ektlar va dekoratorlar uchun umumiy funksionallikni belgilovchi interfeys yoki abstrakt sinf.
  • Aniq komponent (Concrete Component): Komponentning amalga oshirilishi, asosiy ob’ekt bo‘lib, unga funksionallik qo‘shiladi.
  • Dekorator (Decorator): Interfeysni amalga oshiradigan va komponent ob’ektiga havola o‘z ichiga olgan abstrakt sinf.
  • Aniq dekorator (Concrete Decorator): Dekoratorning amalga oshirilishi, o‘ralgan ob’ektning metodini chaqirishdan oldin yoki keyin maxsus funksionallik qo‘shadi.

Python misoli:

# Komponent
class Coffee:
    def get_cost(self):
        return 5 # Asosiy narx
    
    def get_description(self):
        return "Oddiy qahva"

# Aniq komponent
class SimpleCoffee(Coffee):
    pass

# Dekorator
class CoffeeDecorator(Coffee):
    def __init__(self, coffee):
        self._coffee = coffee

    def get_cost(self):
        return self._coffee.get_cost()

    def get_description(self):
        return self._coffee.get_description()

# Aniq dekorator
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._coffee.get_cost() + 2 # Sut narxini qo‘shamiz

    def get_description(self):
        return self._coffee.get_description() + ", Sut"

# Foydalanish
# simple_coffee = SimpleCoffee()
# print(f"Narx: {simple_coffee.get_cost()}, Tavsif: {simple_coffee.get_description()}")

# sut bilan qahva = MilkDecorator(simple_coffee)
# print(f"Narx: {sut bilan qahva.get_cost()}, Tavsif: {sut bilan qahva.get_description()}")

Afzalliklar:

  • Moslashuvchanlik: Funksionallik ish vaqtida qo‘shiladi.
  • Subklasslardan qochish: Har bir xulq-atvor kombinatsiyasi uchun ko‘p subklasslar yaratishdan qochish mumkin.
  • Mas’uliyatlarni ajratish: Har bir xulq-atvor qo‘shilishi alohida sinfda amalga oshiriladi.

Kamchiliklar:

  • Sinflar sonini oshirishi mumkin.
  • Debug qilish qiyinlashishi mumkin, chunki qobiq zanjiri murakkablashadi.