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:
- "Yoqimli" funksionallik kengaytmasi: Dastur davomida ob'ektning xatti-harakatini qo'shish yoki o'zgartirish kerak bo'lsa, qo'llaniladi.
- Meros o'rniga: Har bir xatti-harakatlar kombinatsiyasi uchun subklasslar yaratish o'rniga, dekoratorlar ishlatiladi. Bu yanada moslashuvchan yondashuv.
- 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