Sobes.tech
Middle

Ի՞նչ է դեկորատորը (Decorator) ծրագրավորման կոնտեքստում և ինչպես է այն օգտագործվում:

sobes.tech AI

Պատասխան AI-ից

Դեկորատորը՝ դա կառուցվածքային նախագծման օրինակ է, որը թույլ է տալիս դինամիկ կերպով ավելացնել նոր վարքագիծ կամ պարտականություններ օբյեկտներին՝ առանց նրանց կառուցվածքը փոփոխելու:

Հիմնական գաղափարներ՝

  • Օբյեկտը պատում է, ընդլայնելով նրա գործառույթը:
  • Պահպանում է պատվող օբյեկտի ինտերֆեյսը՝ ապահովելով փոխարինելիությունը:
  • Արժեք է տալիս դասերի հիերարխիայի աճից՝ նոր վարքագծի համակցություններ ավելացնելիս:

Օգտագործում՝

  1. "Օն-դ-ֆլյու" գործառույթների ընդլայնում՝ երբ անհրաժեշտ է ավելացնել կամ փոխել օբյեկտի վարքագիծը ծրագրի գործարկման ժամանակ:
  2. Ներառման փոխարեն՝ երբ փոխարինում եք ժառանգությանը՝ օգտագործելով դեկորատորներ՝ ավելի ճկուն մոտեցում:
  3. Վարքագծերի համակցում՝ տարբեր դեկորատորներ կարող են կիրառվել նույն օբյեկտին տարբեր կարգով՝ ստեղծելով յուրահատուկ համակցություններ:

Python-ում օրինակ՝

# Հիմնական կոմպոնենտ
class Component:
    def operation(self):
        pass

# կոնկրետ կոմպոնենտ
class ConcreteComponent(Component):
    def operation(self):
        return "ConcreteComponent"

# Հիմնական դեկորատոր (պահպանում է հղում պատվող օբյեկտին)
class Decorator(Component):
    def __init__(self, component):
        self._component = component

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

# կոնկրետ դեկորատոր A
class ConcreteDecoratorA(Decorator):
    def operation(self):
        return f"ConcreteDecoratorA({self._component.operation()})"

# կոնկրետ դեկորատոր B
class ConcreteDecoratorB(Decorator):
    def operation(self):
        return f"ConcreteDecoratorB({self._component.operation()})"

# Օգտագործում
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-ում @ սինտաքսիկ շաքար՝

def my_decorator(func):
    def wrapper():
        print("Նախ ֆունկցիայի")
        func()
        print("Հետո ֆունկցիայի")
    return wrapper

@my_decorator
def say_hello():
    print("Բարև!")

say_hello()
# Արտածում՝
# Նախ ֆունկցիայի
# Բարև!
# Հետո ֆունկցիայի