Sobes.tech
Middle

Dasturlash kontekstida dekorator nima va u qanday ishlatiladi?

sobes.tech AI

AIdan javob

Dekorator — bu qurilish naqshingi bo'linmasi bo'lib, u ob'ektlarning tuzilmasini o'zgartirmasdan, ularga dinamik ravishda yangi xatti-harakatlar yoki mas'uliyatlar qo'shishga imkon beradi.

Asosiy g'oyalar:

  • Mavjud ob'ektni o'rab, uning funksionalligini kengaytiradi.
  • O'rab olingan ob'ektning interfeysini saqlaydi va almashtiriluvchanlikni ta'minlaydi.
  • Yangi xatti-harakatlar kombinatsiyalarini qo'shishda sinf merosxo'rligining kengayishini oldini oladi.

Foydalanish:

  1. "Yoqimli" funksionallik kengaytmasi: Dastur davomida ob'ektning xatti-harakatini qo'shish yoki o'zgartirish kerak bo'lsa, qo'llaniladi.
  2. Meros o'rniga: Har bir xatti-harakatlar kombinatsiyasi uchun subklasslar yaratish o'rniga, dekoratorlar ishlatiladi. Bu yanada moslashuvchan yondashuv.
  3. Xatti-harakatlarning kombinatsiyasi: Turli dekoratorlar bir vaqtning o'zida bir ob'ektga turli tartibda qo'llanilishi mumkin, bu esa noyob kombinatsiyalar yaratadi.

Python misoli:

# Asosiy komponent
class Component:
    def operation(self):
        pass

# Aniq komponent
class ConcreteComponent(Component):
    def operation(self):
        return "ConcreteComponent"

# Asosiy dekorator (sarmoya qilingan ob'ektga havola saqlaydi)
class Decorator(Component):
    def __init__(self, component):
        self._component = component

    def operation(self):
        return self._component.operation()

# Aniq dekorator A
class ConcreteDecoratorA(Decorator):
    def operation(self):
        return f"ConcreteDecoratorA({self._component.operation()})"

# Aniq dekorator B
class ConcreteDecoratorB(Decorator):
    def operation(self):
        return f"ConcreteDecoratorB({self._component.operation()})"

# Foydalanish
simple = ConcreteComponent()
print(simple.operation())  # ConcreteComponent

decorated_a = ConcreteDecoratorA(simple)
print(decorated_a.operation()) # ConcreteDecoratorA(ConcreteComponent)

decorated_b_a = ConcreteDecoratorB(decorated_a)
print(decorated_b_a.operation()) # ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))

Python'da sintaksis shakar sifatida @ misoli:

def my_decorator(func):
    def wrapper():
        print("Funktsiyadan oldin")
        func()
        print("Funktsiyadan keyin")
    return wrapper

@my_decorator
def say_hello():
    print("Salom!")

say_hello()
# Chiqarish:
# Funktsiyadan oldin
# Salom!
# Funktsiyadan keyin