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.