Σε αυτό το άρθρο, θα συνεχίσουμε τη μελέτη μοτίβων σχεδίασης Java εξετάζοντας το Μοτίβο σχεδίασης διακομιστή μεσολάβησης. Είναι ένα από τα Μοτίβα δομικής σχεδίασης, και μπορούμε να το βρούμε πρακτικά στα πλαίσια JDK και Spring. Χρησιμοποιώντας μια εφαρμογή Java, θα καταλάβουμε τι είναι αυτό το μοτίβο. Μετά από αυτό, θα εξετάσουμε τα πλεονεκτήματα, τη χρήση και τα μειονεκτήματα του σχεδίου.
Μοτίβο σχεδίασης διακομιστή μεσολάβησης
ο Μοτίβο σχεδίασης διακομιστή μεσολάβησης είναι ένα μοτίβο δομικής σχεδίασης που μας δίνει τη δυνατότητα να δημιουργήσουμε ένα stand-in ή να αντικαταστήσουμε ένα άλλο αντικείμενο. Χρησιμοποιώντας έναν διακομιστή μεσολάβησης, μπορείτε να εκτελέσετε μια ενέργεια είτε πριν είτε αφότου το αίτημα φτάσει στο αρχικό αντικείμενο, ελέγχοντας την πρόσβαση σε αυτό.
Πρόβλημα
Γιατί θέλετε να περιορίσετε ποιος έχει πρόσβαση σε κάτι; Για παράδειγμα, φανταστείτε ότι έχετε ένα μεγάλο αντικείμενο που χρησιμοποιεί πολλούς πόρους συστήματος. Δεν το χρειάζεστε πάντα, αλλά μερικές φορές το χρειάζεστε. Ένας τρόπος για να το λύσετε χρησιμοποιώντας lazy αρχικοποίηση, που θα σας επέτρεπε να δημιουργήσετε ένα αντικείμενο μόνο όταν απαιτείται. Κάποιος κώδικας αρχικοποίησης που έχει αναβληθεί θα πρέπει να εκτελεστεί από κάθε πελάτη του αντικειμένου. Δυστυχώς, πιθανότατα θα υπήρχε μεγάλος αριθμός διπλασιασμού κώδικα.
Λύση
Χρησιμοποιώντας το μοτίβο σχεδίασης διακομιστή μεσολάβησης, αναπτύξτε μια νέα κλάση διακομιστή μεσολάβησης που έχει την ίδια διεπαφή με ένα αντικείμενο κύριας υπηρεσίας. Στη συνέχεια, ενημερώνετε την εφαρμογή σας για να μεταβιβάσετε το αντικείμενο διακομιστή μεσολάβησης σε όλους τους πελάτες του αρχικού αντικειμένου. Ο διακομιστής μεσολάβησης δημιουργεί ένα πραγματικό αντικείμενο υπηρεσίας και μεταβιβάζει όλη την ευθύνη σε αυτό αφού λάβει ένα αίτημαt από πελάτη.
1. Μοτίβο σχεδίασης διακομιστή μεσολάβησης Java
Είναι πάντα καλύτερο να κατανοείτε το μοτίβο σχεδίασης Java χρησιμοποιώντας ένα παράδειγμα. Ας πάρουμε το παράδειγμα της πρόσβασης στο Διαδίκτυο στον εργαζόμενο για να κατανοήσουμε καλύτερα το μοτίβο του διακομιστή μεσολάβησης. Θα περάσουμε από τα διακριτά βήματα για να διευκρινίσουμε το σχέδιο σχεδίασης.
Βήμα 1: Αρχικά, ας δημιουργήσουμε μια διεπαφή InternetAccess
για την παροχή πρόσβασης στο Διαδίκτυο στους εργαζόμενους:
public interface InternetAccess {
public void grantInternetAccessToEmployees();
}
Βήμα 2: Για να χορηγήσετε την εξουσιοδότηση στον συγκεκριμένο εργαζόμενο, δημιουργήστε ένα EmployeeInternetAccess
κλάση που υλοποιεί το InternetAccess
διεπαφή.
public class EmployeeInternetAccess implements InternetAccess {
private String employeeName;
@Override
public void grantInternetAccessToEmployees() {
System.out.println("Internet Access granted for employee: " + employeeName);
}
public EmployeeInternetAccess(String empName) {
this.employeeName = empName;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
}
Βήμα 3: Για να παρέχετε το αντικείμενο της κλάσης EmployeeInternetAccess, δημιουργήστε ένα ProxyInternetAccess
κλάση που υλοποιεί το InternetAccess
διεπαφή
public class ProxyEmployeeInternetAccess implements InternetAccess {
private String employeeName;
private EmployeeInternetAccess employeeInternetAccess;
public ProxyEmployeeInternetAccess(String employeeName) {
this.employeeName = employeeName;
}
@Override
public void grantInternetAccessToEmployees() {
if (getRole(employeeName) > 4) {
employeeInternetAccess = new EmployeeInternetAccess(employeeName);
employeeInternetAccess.grantInternetAccessToEmployees();
} else {
System.out.println("No Internet access granted. Your job level is below 5");
}
}
public int getRole(String empName) {
//make a DB call to get the employee role and return it.
return 31;
}
}
Βήμα 4: Δημιουργήστε μια τάξη που ονομάζεται ProxyPatternClient
που μπορεί να παρέχει στους εργαζόμενους πρόσβαση στο διαδίκτυο.
public class ProxyPatternClient {
public static final String EMPLOYEE_NAME = "Aayush Sharma";
public static void main(String[] args) {
InternetAccess internetAccess = new ProxyEmployeeInternetAccess(EMPLOYEE_NAME);
internetAccess.grantInternetAccessToEmployees();
}
}
Βήμα 5: Παραγωγή

2. Διάγραμμα τάξης
Ας δούμε το διάγραμμα της τάξης για καλύτερη κατανόηση

2.1. Παραδείγματα πραγματικού κόσμου
Ας δούμε μερικά από τα πραγματικά παραδείγματα εργασίας του μοτίβου σχεδίασης μεσολάβησης.
- Σε διαχειμάζωδημιουργούμε τον κώδικα για την ανάκτηση οντοτήτων από τη βάση δεδομένων. Διαχειμάζω επιστρέφει ένα αντικείμενο που χρησιμεύει ως διακομιστής μεσολάβησης για την υποκείμενη κατηγορία οντοτήτων. Αυτό το κάνει επεκτείνοντας δυναμικά την κλάση τομέα. Το λογισμικό πελάτη μπορεί να χρησιμοποιήσει τον διακομιστή μεσολάβησης για να διαβάσει οποιαδήποτε δεδομένα απαιτεί. Με τη χρήση αυτών των κατηγοριών οντοτήτων διακομιστή μεσολάβησης, μπορούμε να εφαρμόσουμε σενάρια τεμπέλης φόρτωσης στα οποία ανακτούσε συνδεδεμένες οντότητες μόνο όταν απαιτούνται ειδικά. Βοηθά στην ενίσχυση της αποτελεσματικότητας των δραστηριοτήτων DAO.
- Προστάτευε την πρόσβαση στο διαδίκτυο μέσω α διακομιστή μεσολάβησης δικτύου σε επιχειρηματικά δίκτυα. Όλα τα ερωτήματα δικτύου περνούν από έναν διακομιστή μεσολάβησης, ο οποίος τα ελέγχει για αιτήματα από τομείς που έχουν εγκριθεί πριν από τη δημοσίευση των δεδομένων στο δίκτυο. Εάν ένα αίτημα φαίνεται ύποπτο, ο πληρεξούσιος θα πρέπει να το σταματήσει. Διαφορετικά, το αίτημα θα πρέπει να ολοκληρωθεί.
- Ένα αντικείμενο που παράγεται από το πλαίσιο AOP στο προγραμματισμός προσανατολισμένος σε πτυχές (AOP) για την εκτέλεση των συμβάσεων πτυχών (συμβουλεύει τις εκτελέσεις μεθόδων και ούτω καθεξής). Για παράδειγμα, ένας δυναμικός διακομιστής μεσολάβησης JDK ή α
CGLIB
πληρεξούσιος θα ήταν έναAOP
πληρεξούσιος στοSpring AOP
.
2.2. Διαφορετικά Proxies
- Απομακρυσμένος διακομιστής μεσολάβησης -> απεικονίζει ένα αντικείμενο γαλακτοπαραγωγής σε απόσταση. Ο πελάτης πρέπει να καταβάλει περισσότερη προσπάθεια στη σύνδεση δικτύου εάν θέλει να επικοινωνήσει με μακρινά αντικείμενα. Οι πελάτες επικεντρώνονται στο να έχουν γνήσιες συνομιλίες, ενώ ένα αντικείμενο μεσολάβησης χειρίζεται αυτήν την επικοινωνία για λογαριασμό του αρχικού αντικειμένου.
- Εικονικός διακομιστής μεσολάβησης -> καθυστερεί την κατ‘ απαίτηση δημιουργία και προετοιμασία ακριβών αντικειμένων πριν αυτά χρειαστούν. Οι εικονικοί διακομιστής μεσολάβησης περιλαμβάνουν οντότητες που παράγονται από την Hibernate.
- Proxy προστασίας -> βοηθά στη δημιουργία ασφάλειας πάνω από το αρχικό αντικείμενο. Πριν καλέσουν μια μέθοδο, ενδέχεται να ελέγξουν τα δικαιώματα πρόσβασης και στη συνέχεια να παραχωρήσουν ή να αρνηθούν την πρόσβαση σύμφωνα με τα αποτελέσματα.
- Έξυπνος διακομιστής μεσολάβησης -> εκτελεί πρόσθετες εργασίες γραφείου κάθε φορά που ένας πελάτης έχει πρόσβαση σε ένα αντικείμενο. Ένα παράδειγμα θα ήταν να επιβεβαιώσετε ότι κλείδωσε το πραγματικό αντικείμενο πριν από την πρόσβαση σε αυτό για να βεβαιωθείτε ότι κανένα άλλο αντικείμενο δεν μπορεί να το αλλάξει.
3. Πλεονεκτήματα και μειονεκτήματα του Proxy Pattern
Πριν χρησιμοποιήσετε οποιοδήποτε σχέδιο σχεδίασης, είναι πάντα καλό να βρίσκετε τα πλεονεκτήματα και τα μειονεκτήματα του σχεδίου σχεδίου.
3.1. Πλεονεκτήματα
- Η ασφάλεια είναι ένα πλεονέκτημα του μοτίβου διακομιστή μεσολάβησης.
- Αυτός ο σχεδιασμός αποτρέπει την αντιγραφή δυνητικά εξαιρετικά μεγάλων αντικειμένων με ένταση μνήμης. Αυτό βελτιώνει την απόδοση της εφαρμογής.
- Εγκαθιστώντας έναν διακομιστή μεσολάβησης τοπικού κώδικα (stub) στον υπολογιστή-πελάτη και στη συνέχεια συνδέοντας τον διακομιστή χρησιμοποιώντας απομακρυσμένο κώδικα, ο απομακρυσμένος διακομιστής μεσολάβησης διασφαλίζει επίσης την ασφάλεια.
3.2. Μειονεκτήματα
- Αυτό το μοτίβο προσθέτει ένα άλλο επίπεδο αφαίρεσης, το οποίο μπορεί περιστασιακά να προκαλέσει προβλήματα εάν ορισμένοι πελάτες αποκτήσουν απευθείας πρόσβαση στον κώδικα πραγματικού θέματος ενώ άλλοι ενδέχεται να έχουν πρόσβαση στις κλάσεις Proxy. Αυτό θα μπορούσε να προκαλέσει ασυνεπή συμπεριφορά.
4. Πότε να χρησιμοποιήσετε το μοτίβο σχεδίασης διακομιστή μεσολάβησης;
- Για να παρέχει ένα υποκατάστατο ή ένα σύμβολο κράτησης θέσης για ένα άλλο αντικείμενο για τον έλεγχο της πρόσβασης σε αυτό.
- Για να υποστηρίξετε κατανεμημένη, ρυθμιζόμενη ή έξυπνη πρόσβαση, προσθέστε μια άλλη έμμεση κατεύθυνση.
- Για να αποτρέψετε το να γίνει υπερβολικά πολύπλοκο το πραγματικό στοιχείο, προσθέστε ένα περιτύλιγμα και αντιπροσωπεία.
4.1. Μοτίβο διακομιστή μεσολάβησης εναντίον διακοσμητή
Η κύρια διάκριση μεταξύ των δύο μοτίβων είναι τα βάρη που φέρει κάθε σχέδιο. Οι διακοσμητές επικεντρώνονται στην προσθήκη καθηκόντων, ενώ οι πληρεξούσιοι επικεντρώνονται στον περιορισμό της πρόσβασης σε ένα αντικείμενο.
Περίληψη
Σε αυτή την ανάρτηση, μιλήσαμε για το Μοτίβο σχεδίασης διακομιστή μεσολάβησης. Είδαμε μερικά από τα παραδείγματα του πραγματικού κόσμου μαζί με ορισμένα πλεονεκτήματα της χρήσης αυτού του μοτίβου. Είδαμε επίσης μια υλοποίηση Java για αυτό το μοτίβο σχεδίασης. Μπορείτε πάντα να ελέγχετε το δικό μας Αποθετήριο GitHub για τον πιο πρόσφατο πηγαίο κώδικα.