Sobes.tech
Middle

Mis on dekoratsioon (Decorator) programmeerimise kontekstis ja kuidas seda kasutatakse?

sobes.tech AI

Vastus AI-lt

Dekoratiiv on struktuuriline disainimuster, mis võimaldab dünaamiliselt lisada objekti käitumist või kohustusi ilma nende struktuuri muutmata.

Peamised ideed:

  • Kattub olemasoleva objekti, laiendades selle funktsionaalsust.
  • Säilitab kattuva objekti liidese, tagades vahetatavuse.
  • Vältib klassihierarhia kasvamist uute käitumise kombinatsioonide lisamisel.

Kasutamine:

  1. Funktsionaalsuse "elus" laiendamine: kasutatakse, kui on vaja lisada või muuta objekti käitumist programmi täitmise ajal.
  2. Päriluse alternatiiv: asemel, et luua iga käitumise kombinatsiooni jaoks alamklasse, kasutatakse dekoraatoreid. See on paindlikum lähenemine.
  3. Käitumiste kombineerimine: erinevad dekoratsioonid võivad olla rakendatud samale objekti erinevas järjekorras, luues unikaalseid kombinatsioone.

Näide Pythonis:

# Põhikomponent
class Component:
    def operation(self):
        pass

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

# Põhiline dekoratsioon (hoiab viidet kattuvale objekti)
class Decorator(Component):
    def __init__(self, component):
        self._component = component

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

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

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

# Kasutamine
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))

Pythonis @ süntaksisuhkur:

def my_decorator(func):
    def wrapper():
        print("Enne funktsiooni")
        func()
        print("Pärast funktsiooni")
    return wrapper

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

say_hello()
# Väljund:
# Enne funktsiooni
# Tere!
# Pärast funktsiooni