Sobes.tech
Junior — Middle

Μπορείτε να εξηγήσετε τις διαφορές μεταξύ των προτύπων Adapter και Decorator στο πλαίσιο του σχεδιασμού λογισμικού;

sobes.tech AI

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

Τα μοτίβα Adapter και Decorator συχνά συγχέονται, αλλά έχουν διαφορετικούς στόχους και τρόπους εφαρμογής:

  • Adapter (Προσαρμογέας) — χρησιμεύει για τη μετατροπή του διεπαφής μιας κλάσης στη διεπαφή που περιμένει ο πελάτης. Χρησιμοποιείται όταν πρέπει να κάνουν συνεργασία ασυμβίβαστων διεπαφών. Ο προσαρμογέας περικλείει το αντικείμενο και μεταφράζει τις κλήσεις του πελάτη σε κλήσεις στο προσαρμοσμένο αντικείμενο.

  • Decorator (Διακοσμητής) — προορίζεται για την δυναμική προσθήκη νέων ευθυνών σε ένα αντικείμενο χωρίς να αλλάξει η διεπαφή του. Ο διακοσμητής περικλείει το αντικείμενο και επεκτείνει ή τροποποιεί τη συμπεριφορά του.

Βασικές διαφορές:

  • Ο προσαρμογέας αλλάζει τη διεπαφή του αντικειμένου ώστε να είναι συμβατή με τον πελάτη.
  • Ο διακοσμητής διατηρεί τη διεπαφή του αντικειμένου, αλλά προσθέτει νέα συμπεριφορά.

Παράδειγμα σε Java:

// Adapter: προσαρμογή της διεπαφής
interface Target {
    void request();
}

class Adaptee {
    void specificRequest() {
        System.out.println("Ειδικό αίτημα");
    }
}

class Adapter implements Target {
    private Adaptee adaptee;
    Adapter(Adaptee a) { this.adaptee = a; }
    public void request() {
        adaptee.specificRequest();
    }
}

// Decorator: προσθήκη συμπεριφοράς
interface Component {
    void operation();
}

class ConcreteComponent implements Component {
    public void operation() {
        System.out.println("Κύρια λειτουργία");
    }
}

class Decorator implements Component {
    protected Component component;
    Decorator(Component c) { this.component = c; }
    public void operation() {
        component.operation();
    }
}

class ConcreteDecorator extends Decorator {
    ConcreteDecorator(Component c) { super(c); }
    public void operation() {
        super.operation();
        System.out.println("Πρόσθετη συμπεριφορά");
    }
}