Σε αυτό το άρθρο σχεδίων σχεδίων, θα εξετάσουμε το Μοτίβο σχεδίασης προσαρμογέα. Θα δούμε τις διάφορες περιπτώσεις χρήσης του με κάποιο παράδειγμα και τέλος θα έχουμε το μοτίβο σχεδίασης Adapter στην Java. Είναι ένα από τα δομικά μοτίβα και μπορούμε να βρούμε τις χρήσεις του σε όλες σχεδόν τις βιβλιοθήκες στο πλαίσιο JDK και Spring.
Μοτίβο σχεδίασης προσαρμογέα
ΤΤο μοτίβο σχεδίασης προσαρμογέα είναι μέρος του μοτίβου δομικής σχεδίασης στην Java. Επιτρέπει σε δύο μη συμβατές διεπαφές, κλάσεις και υπηρεσίες να επικοινωνούν μεταξύ τους. Αυτά τα ασύμβατα στοιχεία μπορούν να συνομιλούν μεταξύ τους, εκτός εάν αλλάξουν τον κώδικά τους ή τη συμπεριφορά του πελάτη. Λαμβάνει είσοδο από ένα στοιχείο (πελάτη), το μετατρέπει στην αναμενόμενη μορφή πριν το δώσει στο άλλο στοιχείο.
Συχνά μπερδευόμαστε ότι τα μοτίβα του προσαρμογέα και της γέφυρας είναι τα ίδια, ωστόσο δεν είναι. Ο προσαρμογέας λειτουργεί σε υπάρχοντα ασύμβατα εξαρτήματα, ενώ το μοτίβο Bridge είναι μια εκ των προτέρων σχεδίαση. Μπορούμε να δούμε τα παραδείγματα των μοτίβων προσαρμογέων και στην πραγματική ζωή. Όταν ταξιδεύουμε σε ευρωπαϊκές/αμερικανικές χώρες από την Ινδία, χρειαζόμαστε έναν προσαρμογέα φόρτισης για να συνδέσουμε το ρεύμα στο φορητό υπολογιστή μας. Οι πρίζες είναι διαφορετικές σε διαφορετικές χώρες και ως εκ τούτου πρέπει να φέρουμε έναν προσαρμογέα.
Γνωρίζαμε επίσης το μοτίβο προσαρμογέα ως σχέδιο σχεδίασης Wrapper.
1. Πώς λειτουργεί το μοτίβο σχεδίασης προσαρμογέα;
Ας εξετάσουμε την παρακάτω εικόνα για να καταλάβουμε πώς λειτουργεί το μοτίβο του προσαρμογέα;

Σύμφωνα με το παραπάνω διάγραμμα, μπορούμε να δούμε ότι υπάρχουν δύο διαδικασίες, Διαδικασία 1 και Διαδικασία Δεύτερη. Αυτές οι δύο διαδικασίες είναι ασυμβίβαστες μεταξύ τους, αλλά πρέπει να επικοινωνούν μεταξύ τους. Η διαδικασία που παράγει ένα „έξοδος Α“ και η διαδικασία Two απαιτεί „έξοδος Β”? εδώ εμφανίζεται το μοτίβο του προσαρμογέα στην εικόνα. Λειτουργεί ως διαμεσολαβητής και λαμβάνει το «έξοδος Α“ και το μετατρέπει σε „έξοδος Β” και το παραδίδει για να επεξεργαστεί το Two.
2. Τύπος μοτίβου προσαρμογέα
Υπάρχουν δύο τύποι υλοποιήσεων για το μοτίβο προσαρμογέα.
- Μοτίβο προσαρμογέα αντικειμένου.
- Μοτίβο προσαρμογέα τάξης.
Ας δούμε ποια είναι η διαφορά μεταξύ αυτών των δύο.
2.1. Προσαρμογέας αντικειμένου
- Χρησιμοποιεί σύνθεση για να τυλίξετε κλάσεις ή διεπαφές ή και τα δύο.
- Λόγω του σημείου #1, χρησιμοποιεί αντιπροσωπεία για να γίνει η δουλειά.
- Χρησιμοποιούμε αυτήν την προσέγγιση όταν δεν υπάρχει τρόπος να υποκατηγορήσουμε την κλάση που πρόκειται να προσαρμοστεί σύμφωνα με τη διεπαφή του πελάτη. Η τάξη μπορεί να έχει δηλωθεί ως „τελική“.
- Χρησιμοποιούμε αυτήν την προσέγγιση όταν, ανάλογα με την περίπτωση, ο πελάτης θέλει ένα συμβόλαιο που δεν είναι μια διεπαφή αλλά μια αφηρημένη κλάση.

2.2 Προσαρμογέας κλάσης
- Χρησιμοποιεί κληρονομία να τυλίξουν μόνο τις τάξεις.
- Λόγω του σημείου #1, χρησιμοποιεί Υποκατηγορία για να γίνει η δουλειά.
- Χρησιμοποιούμε αυτήν την προσέγγιση όταν είναι δυνατή η υποκατηγορία και ο πελάτης αναμένει να συνάψει σύμβαση με μια αφηρημένη κλάση.

Θα χρησιμοποιήσουμε την υλοποίηση προσαρμογέα αντικειμένου για αυτό το άρθρο. Και τα δύο είναι ίδια και μπορείτε να επιλέξετε ένα από αυτά με βάση τις προτιμήσεις σας.
3. Μοτίβο σχεδίασης προσαρμογέα σε Java
Ας κατανοήσουμε το μοτίβο του προσαρμογέα χρησιμοποιώντας ένα παράδειγμα στην Java. Ας πούμε ότι έχουμε μια διεπαφή MediaPlayer
και μια τάξη υλοποίησης σκυροδέματος AudioPlayer
. Αυτή η κλάση μπορεί από προεπιλογή να αναπαράγει μόνο το αρχείο που έχει επέκταση „.mp3“. Έχουμε λίγες πρόσθετες διεπαφές και κλάσεις.
- Μια άλλη διεπαφή
AdvancedMediaPlayer
για την εκ των προτέρων αναπαραγωγή πολυμέσων. - Μαθήματα από σκυρόδεμα
Mp4MusicPlayer
την εφαρμογήAdvancedMediaPlayer
να παίξουμεmp4
μορφή αρχείων. - Τάξη
VlcMusicPlayer
την εφαρμογήAdvancedMediaPlayer
να παίξουμεvlc
μορφή.
Τι γίνεται αν θέλουμε να κάνουμε το AudioPlayer να παίζει αρχεία μορφής mp4 και vlc? Για να το πετύχουμε αυτό, θα χρειαστούμε ένα προσαρμογέας τάξη MediaAdapter
το οποίο θα υλοποιώ, εφαρμόζω τη διεπαφή MediaPlayer
και θα χρησιμοποιήσει AdvancedMediaPlayer
υλοποιήσεις για αναπαραγωγή της απαιτούμενης μορφής.
ο AudioPlayer
θα περάσει την επιθυμητή μορφή αρχείου (ήχου) στον προσαρμογέα μας MediaAdapter
χωρίς γνώση της πραγματικής συγκεκριμένης τάξης που θα παίξει αυτή τη μορφή. ο MediaAdapter
Η τάξη θα φροντίσει για την πραγματική υλοποίηση της τάξης με βάση τη μορφή εισόδου και θα παίξει αυτό το τραγούδι. Ας δούμε ποιες είναι οι διαφορετικές κλάσεις για την εφαρμογή του μοτίβου σχεδίασης προσαρμογέα στην Java.
3.1. Media Player
public interface MediaPlayer{
void playMusic(String audioType, String fileName);
}
3.2. Προηγμένο Media Player
public interface AdvancedMediaPlayer {
void playVlcPlayer(String fileName);
void playMp4Player(String fileName);
}
Ας εφαρμόσουμε τις συγκεκριμένες τάξεις υλοποιώντας το AdvancedMediaPlayer
διεπαφή.
3.3. VLC Music Player
public class VlcMusicPlayer implements AdvancedMediaPlayer {
@Override
public void playVlcPlayer(String fileName) {
System.out.println("Playing vlc file: " + fileName);
}
@Override
public void playMp4Player(String fileName) {
//do nothing
}
}
3.4. MP4 Music Player
public class Mp4MusicPlayer implements AdvancedMediaPlayer {
@Override
public void playVlcPlayer(String fileName) {
//do nothing
}
@Override
public void playMp4Player(String fileName) {
System.out.println("Playing mp4 file: " + fileName);
}
}
Ας εφαρμόσουμε την κλάση προσαρμογέα MediaAdapter
που θα εφαρμόσει το MediaPlayer
διεπαφή.
3.5. Προσαρμογέας πολυμέσων
public class MediaAdapter implements MediaPlayer {
public static final String VLC = "vlc";
public static final String MP_4 = "mp4";
private AdvancedMediaPlayer advancedMusicPlayer;
public MediaAdapter(String audioType) {
if (audioType.equalsIgnoreCase(VLC)) {
advancedMusicPlayer = new VlcMusicPlayer();
} else if (audioType.equalsIgnoreCase(MP_4)) {
advancedMusicPlayer = new Mp4MusicPlayer();
}
}
@Override
public void playMusic(String audioType, String fileName) {
if (audioType.equalsIgnoreCase(VLC)) {
advancedMusicPlayer.playVlcPlayer(fileName);
} else if (audioType.equalsIgnoreCase(MP_4)) {
advancedMusicPlayer.playMp4Player(fileName);
}
}
}
3.6. Αναπαραγωγή ήχου
public class AudioPlayer implements MediaPlayer {
private MediaAdapter mediaAdapter;
@Override
public void playMusic(String audioType, String fileName) {
//the mp3 format is supported by AudioPlayer itself and it doesn't need adapter here.
if (audioType.equalsIgnoreCase("mp3")) {
System.out.println("Playing mp3 file: " + fileName);
}
//to support other formats, we will need the MediaAdapter
else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.playMusic(audioType, fileName);
} else {
System.out.println("The given format: " + audioType + " is not supported");
}
}
}
Στη συνέχεια, ας εφαρμόσουμε την κλάση επίδειξης AdapterPatternDemo
που θα χρησιμοποιήσει το AudioPlayer
για αναπαραγωγή διαφορετικών μορφών ήχου. Θα εκτυπώσει ένα μήνυμα (αποβολή εξαίρεσης) σε περίπτωση που η μορφή αρχείου δεν υποστηρίζεται.
public class AdapterPatternDemo {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.playMusic("mp3", "song1.mp3");
audioPlayer.playMusic("mp4", "song2.mp4");
audioPlayer.playMusic("vlc", "song3.vlc");
audioPlayer.playMusic("xyz", "song4.avi");
}
}
Παραγωγή

4. Πλεονεκτήματα και μειονεκτήματα
Ακολουθούν ορισμένα πλεονεκτήματα και μειονεκτήματα της χρήσης του μοτίβου σχεδίασης προσαρμογέα.
4.1 Πλεονεκτήματα
- Επιτρέπει την επαναχρησιμοποίηση ενός υπάρχοντος κώδικα/λειτουργικότητας.
- Δεύτερον, επιτρέπει σε δύο ή περισσότερα ασύμβατα αντικείμενα να αλληλεπιδρούν.
- Μπορούμε να απομονώσουμε τη διεπαφή από τον κώδικα μετατροπής δεδομένων, υποστηρίζοντας έτσι το Αρχή Ενιαίας Ευθύνης.
- Τέλος, μπορούμε να εισαγάγουμε νέες παραλλαγές για προσαρμογείς στην εφαρμογή μας χωρίς να σπάσουμε τον υπάρχοντα κωδικό πελάτη.
4.2. Μειονεκτήματα
Μερικά μειονεκτήματα της χρήσης του μοτίβου σχεδιασμού προσαρμογέα
- Το μόνο μειονέκτημα αυτού του μοτίβου είναι ότι αυξάνει τη συνολική πολυπλοκότητα του κώδικα. είναι σχετικά πιο απλό να αλλάξετε την κλάση υπηρεσιών που ταιριάζει με τον υπόλοιπο κώδικά σας.
5. Πότε να χρησιμοποιήσετε το μοτίβο σχεδίασης προσαρμογέα
- Όταν θέλουμε ένα αντικείμενο να χρησιμοποιεί μια υπάρχουσα μη συμβατή διεπαφή.
- Όταν χρειαζόμαστε έναν μηχανισμό για δύο υπάρχουσες μη συμβατές διεπαφές/τάξεις για να συνομιλούν μεταξύ τους.
- Όταν θέλουμε να δημιουργήσουμε ένα μεσαίο επίπεδο για τη δημιουργία μιας σύνδεσης από τον σύγχρονο κώδικα και τον υπάρχοντα κώδικα παλαιού τύπου.
- Όταν θέλουμε να δημιουργήσουμε ένα μεσαίο επίπεδο για τη δημιουργία μιας σύνδεσης από τον μοντέρνο κωδικό σας και τον κωδικό τρίτου κατασκευαστή.
Περίληψη
Σε αυτή την ανάρτηση, μιλήσαμε για το Μοτίβο σχεδίασης προσαρμογέα. Είδαμε μερικά από τα παραδείγματα του πραγματικού κόσμου μαζί με ορισμένα πλεονεκτήματα της χρήσης αυτού του μοτίβου. Είδαμε επίσης μια υλοποίηση Java για αυτό το μοτίβο σχεδίασης. Μπορείτε πάντα να ελέγχετε το δικό μας Αποθετήριο GitHub για τον πιο πρόσφατο πηγαίο κώδικα. Ακολουθούν μερικά παραδείγματα από το JDK / Spring Framework χρησιμοποιώντας το ίδιο σχέδιο σχεδίασης.