Middle
Τι είναι ο διακοσμητής (Decorator) στο πλαίσιο του προγραμματισμού και πώς χρησιμοποιείται;
sobes.tech AI
Απάντηση από AI
Ο διακοσμητής είναι ένα δομικό μοτίβο σχεδίασης που επιτρέπει την δυναμική προσθήκη νέας συμπεριφοράς ή ευθυνών σε αντικείμενα χωρίς να τροποποιεί τη δομή τους.
Βασικές ιδέες:
- Τυλίγει ένα υπάρχον αντικείμενο, επεκτείνοντας τη λειτουργικότητά του.
- Διατηρεί το interface του τυλιγμένου αντικειμένου, διασφαλίζοντας την εναλλαξιμότητα.
- Αποφεύγει την αύξηση της ιεραρχίας κλάσεων κατά την προσθήκη νέων συνδυασμών συμπεριφοράς.
Χρήση:
- Επέκταση της λειτουργικότητας "εν κινήσει": Εφαρμόζεται όταν χρειάζεται να προστεθεί ή να αλλάξει η συμπεριφορά ενός αντικειμένου κατά την εκτέλεση του προγράμματος.
- Εναλλακτική λύση στην κληρονομικότητα: Αντί να δημιουργούνται υποκλάσεις για κάθε συνδυασμό συμπεριφορών, χρησιμοποιούνται διακοσμητές. Αυτή είναι μια πιο ευέλικτη προσέγγιση.
- Συνδυασμός συμπεριφορών: Διάφοροι διακοσμητές μπορούν να εφαρμοστούν στο ίδιο αντικείμενο με διαφορετική σειρά, δημιουργώντας μοναδικούς συνδυασμούς.
Παράδειγμα σε 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()
# Έξοδος:
# Πριν από τη λειτουργία
# Γειά!
# Μετά τη λειτουργία