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

Ας εξετάσουμε μερικά σημαντικά στοιχεία του σχεδίου σχεδίασης της πρόσοψης.
1.1. Κατηγορία Πρόσοψης
Η Πρόσοψη διευκολύνει την πρόσβαση σε μια συγκεκριμένη πτυχή της λειτουργικότητας του υποσυστήματος. Κατανοεί πού πρέπει να κατευθυνθεί το αίτημα του πελάτη και πώς να τρέξει όλα τα κινούμενα στοιχεία.
1.2. Πρόσθετη Κατηγορία Πρόσοψης
Για να αποφευχθεί η συσσώρευση μιας μεμονωμένης πρόσοψης με άσχετα χαρακτηριστικά που θα μπορούσαν να τη μετατρέψουν σε μια ακόμη πολύπλοκη δομή, μπορούμε να δημιουργήσουμε μια κατηγορία Πρόσθετων προσόψεων. Οι πελάτες και άλλες προσόψεις μπορούν και οι δύο να χρησιμοποιούν πρόσθετες προσόψεις.
1.3. Κατηγορίες Υποσυστήματος
Το σύνθετο υποσύστημα περιλαμβάνει πολλά αντικείμενα. Για να τα κάνετε όλα να κάνουν οτιδήποτε χρήσιμο, θα χρειαστεί να μπείτε στη λεπτομέρεια της υλοποίησης του υποσυστήματος, όπως η σωστή προετοιμασία αντικειμένων και η παροχή δεδομένων στη σωστή μορφή. Η πρόσοψη δεν είναι ορατή στις κλάσεις υποσυστήματος. Λειτουργούν εντός του συστήματος και απευθείας μεταξύ τους.
1.4. Πελάτης
Αντί να καλεί απευθείας τα αντικείμενα του υποσυστήματος, ο Πελάτης χρησιμοποιεί την πρόσοψη.
2. Μοτίβο σχεδίασης προσόψεων σε Java
Ας δημιουργήσουμε το μοτίβο σχεδίασης πρόσοψης σε Java. Αυτό θα μας δώσει μια επισκόπηση των διαφορετικών τάξεων Java κατά τη χρήση αυτού του μοτίβου σχεδίασης. Θα φτιάξουμε ένα IMobileShop
διεπαφή και συγκεκριμένες κλάσεις που υλοποιούν το Shape
διεπαφή, δηλ. iPhone, Samsungκαι Nokia. Ως επόμενο βήμα, η κατηγορία πρόσοψης ShopKeeper
ορίζεται. ο ShopKeeper
Η class χρησιμοποιεί τις συγκεκριμένες κλάσεις για να εκχωρήσει κλήσεις χρηστών σε αυτές τις κλάσεις. Η δοκιμαστική μας τάξη, FacadePatternClient
θα χρησιμοποιήσει το ShopKeeper
τάξη για να εμφανίσετε τα αποτελέσματα.
public interface IMobileShop {
/**
* Mobile Model Number
*/
public void getMobileModelNumber();
/**
* Mobile Price
*/
public void getMobilePrice();
}
Δημιουργήστε μια κλάση υλοποίησης για το iPhone
που υλοποιεί το IMobileShop
διεπαφή.
public class Iphone implements IMobileShop {
@Override
public void getMobileModelNumber() {
System.out.println("The model is: IPhone 13");
}
@Override
public void getMobilePrice() {
System.out.println("The price is: 75000INR ");
}
}
Δημιουργία κλάσης υλοποίησης για Samsung
που υλοποιεί το IMobileShop
διεπαφή.
public class Samsung implements IMobileShop {
@Override
public void getMobileModelNumber() {
System.out.println("The model is: Galaxy 11");
}
@Override
public void getMobilePrice() {
System.out.println("The price is: 85000INR ");
}
}
Δημιουργία κλάσης υλοποίησης για Nokia
που υλοποιεί το IMobileShop
διεπαφή.
public class Nokia implements IMobileShop {
@Override
public void getMobileModelNumber() {
System.out.println("The model is: Nokia 1100");
}
@Override
public void getMobilePrice() {
System.out.println("The price is: 1500INR ");
}
}
Τέλος, δημιουργήστε ένα σκυρόδεμα ShopKeeper
κλάση που χρησιμοποιεί το IMobileShop
διεπαφή.
public class ShopKeeper {
private IMobileShop iphone;
private IMobileShop samsung;
private IMobileShop nokia;
/**
* no args constructor
*/
public ShopKeeper() {
iphone = new Iphone();
samsung = new Samsung();
nokia = new Nokia();
}
public void iphonePhoneSale() {
iphone.getMobileModelNumber();
iphone.getMobilePrice();
}
public void samsungPhoneSale() {
samsung.getMobileModelNumber();
samsung.getMobilePrice();
}
public void nokiaPhoneSale() {
nokia.getMobileModelNumber();
nokia.getMobilePrice();
}
}
2.1. FacadePatternClient Class
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class FacadePatternClient {
private static int choice;
public static void main(String args[]) throws NumberFormatException, IOException {
do {
System.out.print("========= Mobile Shop ============ \n");
System.out.print("1. IPHONE. \n");
System.out.print("2. SAMSUNG. \n");
System.out.print("3. NOKIA. \n");
System.out.print("4. Exit. \n");
System.out.print("Enter your choice: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
choice = Integer.parseInt(br.readLine());
ShopKeeper shopKeeper = new ShopKeeper();
switch (choice) {
case 1:
{
shopKeeper.iphonePhoneSale();
}
break;
case 2:
{
shopKeeper.samsungPhoneSale();
}
break;
case 3:
{
shopKeeper.nokiaPhoneSale();
}
break;
default:
{
System.out.println("Nothing You purchased");
}
return;
}
} while (choice != 4);
}
}
Παραγωγή
========= Mobile Shop ============
1. IPHONE.
2. SAMSUNG.
3. NOKIA.
4. Exit.
Enter your choice: 1
The model is: IPhone 13
The price is: 75000INR
========= Mobile Shop ============
1. IPHONE.
2. SAMSUNG.
3. NOKIA.
4. Exit.
Enter your choice: 2
The model is: Galaxy 11
The price is: 85000INR
========= Mobile Shop ============
1. IPHONE.
2. SAMSUNG.
3. NOKIA.
4. Exit.
Enter your choice: 3
The model is: Nokia 1100
The price is: 1500INR
========= Mobile Shop ============
1. IPHONE.
2. SAMSUNG.
3. NOKIA.
4. Exit.
Enter your choice: 4
Nothing You purchased
Process finished with exit code 0
Έτσι φαίνεται το διάγραμμα κλάσης για το μοτίβο σχεδιασμού της πρόσοψης

3. Πλεονεκτήματα και μειονεκτήματα
Ας δούμε μερικά πλεονεκτήματα και μειονεκτήματα της χρήσης του μοτίβου πρόσοψης.
- Προστατεύει τους πελάτες από τις περιπλοκές των στοιχείων του υποσυστήματος.
- Ενθαρρύνει τα υποσυστήματα και τους πελάτες να συνδέονται χαλαρά.
Μερικά μειονεκτήματα της χρήσης μοτίβου σχεδίασης πρόσοψης
- Εκτός από την κατασκευή μιας πολύπλοκης κατασκευής, δεν υπάρχουν εμφανή μειονεκτήματα στο σχέδιο της πρόσοψης.
3.1 Πότε να χρησιμοποιήσετε το Μοτίβο Σχεδιασμού Πρόσοψης
- Όταν έχετε ένα εξελιγμένο σύστημα που θέλετε να εκθέσετε στους πελάτες απλά ή όταν θέλετε να δημιουργήσετε ένα εξωτερικό επίπεδο επικοινωνίας σε ένα υπάρχον σύστημα που δεν είναι συμβατό με το σύστημα, το μοτίβο της πρόσοψης είναι ιδανικό.
- Η πρόσοψη ασχολείται με τις διεπαφές χρήστη και όχι με την υλοποίηση. Ο στόχος του είναι να συγκαλύψει την εσωτερική πολυπλοκότητα πίσω από μια ενιαία, απλής εμφάνισης διεπαφή στο εξωτερικό.
- Όταν υπάρχουν πολλές εξαρτήσεις μεταξύ των πελατών και των κλάσεων υλοποίησης μιας αφαίρεσης.
Περίληψη
Σε αυτή την ανάρτηση, μιλήσαμε για το Μοτίβο σχεδίασης πρόσοψης. Είδαμε μερικά από τα παραδείγματα του πραγματικού κόσμου μαζί με ορισμένα πλεονεκτήματα της χρήσης αυτού του μοτίβου. Είδαμε επίσης μια υλοποίηση Java για αυτό το μοτίβο σχεδίασης. Μπορείτε πάντα να ελέγχετε το δικό μας Αποθετήριο GitHub για τον πιο πρόσφατο πηγαίο κώδικα. Ακολουθεί ένα παράδειγμα από το JDK που χρησιμοποιεί το ίδιο σχέδιο σχεδίασης.
javax.faces.context
->FacesContext
χρησιμοποιεί τάξεις αφηρημένης/διασύνδεσης όπωςLifeCycle
,ViewHandler
,NavigationHandler
και πολλά άλλα εσωτερικά, έτσι ώστε ο τελικός χρήστης να μην χρειάζεται να ανησυχεί γι ‚αυτό (μπορεί να παρακαμφθεί με ένεση).
javax.faces.context
-> Εσωτερικώς,ExternalContext
απασχολείServletContext
,HttpSession
,HttpServletRequest
καιHttpServletResponse
.