Μοτίβο σχεδίασης διακοσμητή | Java Development Journal

0
Μοτίβο σχεδίασης διακοσμητή |  Java Development Journal

Σε αυτό το άρθρο, θα συνεχίσουμε τη μελέτη μοτίβων σχεδίασης java εξετάζοντας το Μοτίβο σχεδίασης διακοσμητή. Είναι ένα από τα μοτίβα δομικής σχεδίασης. Θα μάθουμε για αυτό το μοτίβο. Μετά από αυτό, θα εξετάσουμε τα πλεονεκτήματα, τη χρήση και τα μειονεκτήματα του σχεδίου.

Μοτίβο σχεδίασης διακοσμητή

Το μοτίβο σχεδίασης διακοσμητή χρησιμοποιείται για την αλλαγή της λειτουργικότητας ενός αντικειμένου κατά τη διάρκεια του χρόνου εκτέλεσης. Άλλα στιγμιότυπα της ίδιας κλάσης δεν θα επηρεαστούν, επομένως κάθε αντικείμενο θα αλλάξει τη συμπεριφορά του. Το μοτίβο σχεδίασης Decorator είναι ένα δομικό μοτίβο σχεδιασμού που χρησιμοποιεί αφηρημένες τάξεις ή διεπαφές με σύνθεση για υλοποίηση (παρόμοιο με τα μοτίβα προσαρμογέα, γέφυρα και σύνθετα).

Για να επεκτείνουμε τη συμπεριφορά ενός αντικειμένου, χρησιμοποιούμε κληρονομικότητα ή σύνθεση, αλλά αυτό το κάνουμε στο χρόνο μεταγλώττισης και ισχύει για όλες τις παρουσίες της κλάσης. Κατά το χρόνο εκτέλεσης, δεν μπορούμε να προσθέσουμε νέα λειτουργικότητα ή να διαγράψουμε την υπάρχουσα συμπεριφορά — εδώ μπαίνει το μοτίβο Decorator. Επειδή χωρίζουμε τη λειτουργικότητα σε κατηγορίες με ξεχωριστούς τομείς ενδιαφέροντος, τα μοτίβα σχεδίασης διακοσμητών χρησιμοποιούνται συνήθως για την εφαρμογή του μικρόμονότονος Rυπευθυνότητα Παρχή.

Όσον αφορά τη δομή, το σχέδιο του διακοσμητή μοιάζει με το μοτίβο της αλυσίδας ευθύνης. Γνωρίζαμε επίσης το Μοτίβο Διακοσμητή ως Περικάλυμμα.

Αυτό το άρθρο είναι μέρος της σειράς μοτίβων σχεδίασης Java. Σε περίπτωση που ξεκινάτε από τα σχέδια σχεδίασης, θα σας συνιστούσα να ξεκινήσετε από την αρχή της σειράς για καλύτερη κατανόηση και σαφήνεια.

1. Πώς να εφαρμόσετε το μοτίβο του διακοσμητή

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

2. Εφαρμόστε το μοτίβο του διακοσμητή σε Java

Χαρακτηριστικό παράδειγμα σχεδίασης διακοσμητή είναι το παγωτό. Φτιάχνεις ένα βασικό παγωτό και μετά το διακοσμείς με ότι διαλέξεις. Οι προστιθέμενες επικαλύψεις αλλάζουν τη γεύση του απλού παγωτού. Είστε ελεύθεροι να χρησιμοποιήσετε πολλές επικαλύψεις. Παρακάτω είναι ένα παράδειγμα αυτού του σεναρίου σε δράση.

2.1. Δημιουργία διεπαφής
public interface Icecream {
  public String makeIcecream();
}
2.2. Βήμα 2

Βλέπουμε μια διεπαφή που δείχνει ένα παγωτό παραπάνω. Έχω κρατήσει τα πράγματα όσο πιο ξεκάθαρα γίνεται. Παρέχω μια πραγματική υλοποίηση αυτής της διεπαφής στην ακόλουθη κλάση. Στην κορυφή αυτής της βασικής κατηγορίας, θα προστεθούν διακοσμητές.

public class SimpleIcecream implements Icecream {

    @Override
    public String makeIcecream() {
        return "Base Icecream";
    }
}
2.3 Βήμα 3

Ακολουθεί η τάξη του διακοσμητή. Χρησιμεύει ως βάση του σχεδιαστικού μοτίβου του διακοσμητή. Έχει μια ιδιότητα για τον τύπο διεπαφής. Όταν δημιουργείται ένας διακοσμητής χρησιμοποιώντας τον κατασκευαστή συνάρτησής του, ένα στιγμιότυπο εκχωρείται δυναμικά. Μόλις εκχωρηθεί, θα γίνει επίκληση αυτής της μεθόδου παρουσίας.

abstract class IcecreamDecorator implements Icecream {

    protected Icecream specialIcecream;

    public IcecreamDecorator(Icecream specialIcecream) {
        this.specialIcecream = specialIcecream;
    }

    public String makeIcecream() {
        return specialIcecream.makeIcecream();
    }
}
2.4. Βήμα 4

Οι επόμενες δύο κατηγορίες είναι συγκρίσιμες. Αυτές είναι δύο συγκεκριμένες κατηγορίες που εφαρμόζουν αφηρημένα διακοσμητές. Η βασική παρουσία δίνεται στον διακοσμητή κατά τη δημιουργία και εκχωρείται στην υπερκλάση μέσω του κατασκευαστή. Επικαλούμαστε τη βασική μέθοδο στο makeIcecream μέθοδο πριν από τη δική του addNuts function(). Συμπεριλαμβάνοντας νέα στάδια, αυτό addNuts() επεκτείνετε το behaviour.

public class NuttyDecorator extends IcecreamDecorator {

    public NuttyDecorator(Icecream specialIcecream) {
        super(specialIcecream);
    }

    public String makeIcecream() {
        return specialIcecream.makeIcecream() + addNuts();
    }

    private String addNuts() {
        return " + crunchy nuts";
    }
}
public class HoneyDecorator extends IcecreamDecorator {

    public HoneyDecorator(Icecream specialIcecream) {
        super(specialIcecream);
    }

    public String makeIcecream() {
        return specialIcecream.makeIcecream() + addHoney();
    }

    private String addHoney() {
        return " + sweet honey";
    }
}
2.5. Βήματα 5

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

public class TestDecorator {

    public static void main(String args[]) {
        Icecream icecream = new HoneyDecorator(new NuttyDecorator(new BasicIcecream()));
        System.out.println(icecream.makeIcecream());
    }
}
Παραγωγή
Μοτίβο σχεδίασης διακοσμητή

3. Διάγραμμα τάξης

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

μοτίβο σχεδίασης διακοσμητή
Μοτίβο σχεδίασης διακοσμητή

3.1. Πλεονεκτήματα

Ας δούμε μερικά πλεονεκτήματα από τη χρήση αυτού του μοτίβου:

  • Σας δίνει περισσότερες επιλογές από τη στατική κληρονομικότητα.
  • Επειδή οι αλλαγές γίνονται με την κωδικοποίηση νέων κλάσεων, η επεκτασιμότητα του αντικειμένου αυξάνεται.
  • Κάνει την κωδικοποίηση ευκολότερη επιτρέποντάς σας να δημιουργήσετε μια ακολουθία λειτουργιών από ορισμένες κλάσεις αντί να χρειάζεται να κωδικοποιήσετε όλες τις ενέργειες στο αντικείμενο.

3.2. Μειονεκτήματα

Υπάρχουν ορισμένα μειονεκτήματα της χρήσης αυτού του σχεδίου σχεδίου

  • Είναι δύσκολο να αφαιρέσετε ένα συγκεκριμένο περιτύλιγμα από τη στοίβα των περιτυλιγμάτων.
  • Είναι δύσκολο να δημιουργηθεί ένας διακοσμητής του οποίου η συμπεριφορά είναι ανεξάρτητη από τη σειρά με την οποία στοιβάζονται οι διακοσμητές.
  • Ο κωδικός διαμόρφωσης του αρχικού επιπέδου μπορεί να φαίνεται αρκετά άσχημος.

4. Πότε να χρησιμοποιήσετε το μοτίβο σχεδίασης διακοσμητή

Ακολουθούν μερικές από τις περιπτώσεις χρήσης κατά τις οποίες μπορούμε να χρησιμοποιήσουμε το μοτίβο διακοσμητή:

Διαφημίσεις

  • Θέλουμε να αναθέσουμε ευθύνες σε αντικείμενα με διαφάνεια και δυναμική χωρίς να επηρεάζουμε τα άλλα αντικείμενα.
  • Θέλουμε να δώσουμε ένα καθήκον αντικειμένου που μπορεί να θέλετε να αλλάξετε στο μέλλον.
  • Η υποκατηγορία δεν είναι πλέον μια βιώσιμη μέθοδος επέκτασης της λειτουργικότητας.
  • Πρέπει να προσθέσουμε επιπλέον συμπεριφορές σε αντικείμενα κατά το χρόνο εκτέλεσης χωρίς να διαταράξουμε τον κώδικα που τα χρησιμοποιεί και να χρησιμοποιήσουμε την προσέγγιση Decorator.
  • είναι άβολο ή αδύνατο να επεκταθεί η συμπεριφορά ενός αντικειμένου χρησιμοποιώντας κληρονομικότητα. Χρησιμοποιήστε το μοτίβο.

Περίληψη

Σε αυτή την ανάρτηση, μιλήσαμε για το Μοτίβο σχεδίασης διακοσμητή. Είδαμε μερικά από τα παραδείγματα του πραγματικού κόσμου μαζί με ορισμένα πλεονεκτήματα της χρήσης αυτού του μοτίβου. Είδαμε επίσης μια υλοποίηση Java για αυτό το μοτίβο σχεδίασης. Μπορείτε πάντα να ελέγχετε το δικό μας Αποθετήριο GitHub για τον πιο πρόσφατο πηγαίο κώδικα.

Ακολουθούν μερικά παραδείγματα από το JDK χρησιμοποιώντας το ίδιο σχέδιο σχεδίασης:

  • Όλες οι υποκατηγορίες java.io. Οι κατασκευαστές για InputStream, OutputStreamReader και Writer παίρνουν όλα μια παρουσία του ίδιου τύπου.
  • ο checkedXXX(), synchronizedXXX()και unmodifiableXXX() μεθόδους των java.util.Collections πακέτο.
  • HttpServletRequestWrapper και HttpServletResponseWrapper είναι javax.servlet.http.HttpServletRequestWrapper και HttpServletResponseWrapperαντίστοιχα.
  • javax.swing.JScrollPane

Schreibe einen Kommentar