Sobes.tech
Middle

Kas ir dekorators (Decorator) programmēšanas kontekstā un kā tas tiek izmantots?

sobes.tech AI

Atbilde no AI

Dekorators ir struktūras dizaina paraugs, kas ļauj dinamiski pievienot jaunu uzvedību vai pienākumus objektiem bez to struktūras modifikācijas.

Galvenās idejas:

  • Ietin esošo objektu, paplašinot tā funkcionalitāti.
  • Saglabā ietīto objekta interfeisu, nodrošinot aizvietojamību.
  • Novērš klases hierarhijas pieaugumu, pievienojot jaunas uzvedības kombinācijas.

Izmantošana:

  1. Funkcionalitātes "uz vietas" paplašināšana: tiek izmantots, kad nepieciešams pievienot vai mainīt objekta uzvedību programmas izpildes laikā.
  2. Mantošanas alternatīva: vietā, lai izveidotu apakšklases katrai uzvedības kombinācijai, tiek izmantoti dekoratori. Tas ir elastīgāks pieejas veids.
  3. Uzvedības kombinācija: dažādi dekoratori var tikt piemēroti vienam un tam pašam objektam dažādā secībā, radot unikālas kombinācijas.

Piemērs Python:

# Bāzes komponenta
class Component:
    def operation(self):
        pass

# Konkrēts komponenta
class ConcreteComponent(Component):
    def operation(self):
        return "ConcreteComponent"

# Bāzes dekorators (glabā atsauci uz ietīto objektu)
class Decorator(Component):
    def __init__(self, component):
        self._component = component

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

# Konkrēts dekorators A
class ConcreteDecoratorA(Decorator):
    def operation(self):
        return f"ConcreteDecoratorA({self._component.operation()})"

# Konkrēts dekorators B
class ConcreteDecoratorB(Decorator):
    def operation(self):
        return f"ConcreteDecoratorB({self._component.operation()})"

# Lietošana
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 @ sintakses cukurs:

def my_decorator(func):
    def wrapper():
        print("Pirms funkcijas")
        func()
        print("Pēc funkcijas")
    return wrapper

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

say_hello()
# Izvade:
# Pirms funkcijas
# Sveiki!
# Pēc funkcijas