Sobes.tech
Middle

Τι είναι ο διακοσμητής (Decorator) στο πλαίσιο του προγραμματισμού και πώς χρησιμοποιείται;

sobes.tech AI

Απάντηση από AI

Ο διακοσμητής είναι ένα δομικό μοτίβο σχεδίασης που επιτρέπει την δυναμική προσθήκη νέας συμπεριφοράς ή ευθυνών σε αντικείμενα χωρίς να τροποποιεί τη δομή τους.

Βασικές ιδέες:

  • Τυλίγει ένα υπάρχον αντικείμενο, επεκτείνοντας τη λειτουργικότητά του.
  • Διατηρεί το interface του τυλιγμένου αντικειμένου, διασφαλίζοντας την εναλλαξιμότητα.
  • Αποφεύγει την αύξηση της ιεραρχίας κλάσεων κατά την προσθήκη νέων συνδυασμών συμπεριφοράς.

Χρήση:

  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()
# Έξοδος:
# Πριν από τη λειτουργία
# Γειά!
# Μετά τη λειτουργία