Sobes.tech
Middle

Dekorator nima?

sobes.tech AI

AIdan javob

Dekorator — bu strukturaviy dizayn shabloni bo‘lib, u ob'ektlarga dinamik tarzda yangi xatti-harakatlar qo‘shishga imkon beradi va ularni maxsus dekorator ob'ektlariga o‘rab oladi.

Asosiy tamoyillar:

  • Kompazitsiya o‘rniga meros. Dekorator ob'ektning funksionalligini uning sinfini o‘zgartirmasdan va meros olishdan foydalanmasdan kengaytiradi.
  • Moslashuvchanlik. Ob'ektning mas'uliyatlarini ish vaqtida qo‘shish yoki olib tashlash imkonini beradi.
  • Mos keluvchanlik. Dekoratorlar va o‘ralgan ob'ektlar umumiy interfeysga ega bo‘lib, ularni o‘zaro almashtirish imkonini beradi.

Struktura:

  • Komponent (Component): Dinamik tarzda yangi mas'uliyatlar qo‘shilishi mumkin bo‘lgan ob'ektlar uchun interfeys.
  • Konkret komponent (ConcreteComponent): Komponentning amalga oshirilishi.
  • Dekorator (Decorator): Komponentni kengaytiradigan va komponent ob'ektiga havola o‘z ichiga olgan abstrakt sinf yoki interfeys.
  • Konkret dekoratorlar (Concrete Decorators): Maxsus xatti-harakatlar qo‘shadigan dekoratorlarning amalga oshirilishi.

Misol (Python):

// Komponent interfeysi
class Coffee:
    def get_cost(self):
        pass

    def get_description(self):
        pass

// Konkret komponent
class SimpleCoffee(Coffee):
    def get_cost(self):
        return 1.0

    def get_description(self):
        return "Oddiy Qahva"

// Asosiy dekorator
class CoffeeDecorator(Coffee):
    def __init__(self, decorated_coffee):
        self._decorated_coffee = decorated_coffee

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

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

// Konkret dekorator (Sut)
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._decorated_coffee.get_cost() + 0.5

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

// Foydalanish
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Oddiy Qahva: $1.0

coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Oddiy Qahva, Sut: $1.5

Afzalliklar:

  • Ob'ektlarning funksionalligini meros olishdan ko‘ra ko‘proq moslashuvchan tarzda kengaytirish imkonini beradi.
  • Meros bilan bog‘liq subklasslar sonini kamaytiradi.
  • Bir ob'ektga bir nechta "qavat" xatti-harakatlar qo‘shishga imkon beradi.

Kamchiliklar:

  • Kichik ob'ektlar sonining ko‘pligi kodni murakkablashtirishi mumkin.
  • O‘ralish tartibi muhim bo‘lishi mumkin.

QA / Avtomatlashtirishda qo‘llanilishi:

  • Mavjud metodlarga log yozishni qo‘shish, ularning manba kodini o‘zgartirmasdan.
  • Maxsus chaqiriqlar uchun xatoliklarni boshqarishni amalga oshirish.
  • Vaqtni o‘lchash yoki ishlash metriklarini qo‘shish.
  • Test avtomatlashtirish kutubxonalarida (masalan, Page Object shablonida, elementlar bilan o‘zaro ta'sirda tekshiruvlar yoki log yozish uchun).