This is an old revision of the document!
Table of Contents
Proxy Pattern
Το Proxy Pattern (Μοτίβο Μεσολαβητή) ανήκει στα Δομικά Μοτίβα Σχεδίασης (Structural Design Patterns). Ο κύριος σκοπός του είναι να παρέχει ένα υποκατάστατο ή έναν εκπρόσωπο (proxy) για ένα άλλο αντικείμενο, ώστε να ελέγχει την πρόσβαση σε αυτό.
Σκεφτείτε το σαν μια χρεωστική κάρτα. Η κάρτα είναι ο εκπρόσωπος των μετρητών στο λογαριασμό σας. Όταν πληρώνετε με αυτήν, η κάρτα (proxy) μεσολαβεί για να ελέγξει αν υπάρχει το ποσό και να κάνει τη συναλλαγή με τον πραγματικό τραπεζικό λογαριασμό (real subject).
Η δομή του Proxy Pattern
- Subject (Διεπαφή/Interface): Ορίζει την κοινή διεπαφή μεταξύ του Client και του Proxy, ώστε ο Proxy να μπορεί να χρησιμοποιηθεί οπουδήποτε αναμένεται το πραγματικό αντικείμενο.
- RealSubject (Πραγματικό Αντικείμενο): Το πραγματικό αντικείμενο που εκτελεί την ουσιαστική λογική, το οποίο όμως μπορεί να είναι “βαρύ” ή να χρειάζεται έλεγχο πρόσβασης.
- Proxy (Μεσολαβητής): Διατηρεί μια αναφορά (reference) στο RealSubject. Υλοποιεί την ίδια διεπαφή, ελέγχει την πρόσβαση και προωθεί τα αιτήματα στο RealSubject όταν χρειάζεται.
Περιπτώσεις που χρησιμοποιείται
- Virtual Proxy (Εικονικός Μεσολαβητής): Όταν το πραγματικό αντικείμενο είναι “βαρύ” (π.χ. φόρτωμα μιας τεράστιας εικόνας ή σύνδεση σε βάση δεδομένων). Ο Proxy καθυστερεί τη δημιουργία του μέχρι να χρειαστεί πραγματικά (Lazy Initialization).
- Protection Proxy (Μεσολαβητής Προστασίας): Όταν θέλουμε να ελέγξουμε τα δικαιώματα πρόσβασης (Authorization) ενός χρήστη πριν του επιτρέψουμε να καλέσει μια μέθοδο.
- Remote Proxy (Απομακρυσμένος Μεσολαβητής): Όταν το πραγματικό αντικείμενο βρίσκεται σε διαφορετικό reference space (π.χ. σε άλλον server) και ο Proxy αναλαμβάνει τη δικτυακή επικοινωνία (RMI, RPC).
- Logging/Caching Proxy: Για να κρατάμε ιστορικό (logs) των κλήσεων ή για να αποθηκεύουμε αποτελέσματα (cache) ώστε να μην ξαναεκτελείται μια κοστοβόρα λειτουργία.
Παράδειγμα - Protection Internet Proxy
Φανταστείτε έναν Server Διαδικτύου (Internet) όπου ορισμένες ιστοσελίδες είναι μπλοκαρισμένες για συγκεκριμένους χρήστες. Ο proxy υπακούει στο παρακάτων interface.
- Internet.java
// Κοινή διεπαφή για το πραγματικό αντικείμενο και τον Proxy public interface Internet { void connectTo(String serverHost) throws Exception; }
- RealInternet.java
// Η πραγματική υπηρεσία που κάνει τη σύνδεση public class RealInternet implements Internet { @Override public void connectTo(String serverHost) { System.out.println("Επιτυχής σύνδεση στο: " + serverHost); } }
</code java ProxyInternet.java> import java.util.ArrayList; import java.util.List;
public class ProxyInternet implements Internet {
// Lazy initialization: Το πραγματικό αντικείμενο δημιουργείται μόνο αν χρειαστεί private RealInternet realInternet; private static final List<String> bannedSites;
// Λίστα με απαγορευμένες ιστοσελίδες
static {
bannedSites = new ArrayList<>();
bannedSites.add("facebook.com");
bannedSites.add("instagram.com");
bannedSites.add("gaming-site.com");
}
@Override
public void connectTo(String serverHost) throws Exception {
// 1. Έλεγχος Ασφάλειας (Protection Logic)
if (bannedSites.contains(serverHost.toLowerCase())) {
throw new SecurityException("Πρόσβαση Αρνηθείσα! Το site " + serverHost + " είναι μπλοκαρισμένο.");
}
// 2. Lazy Initialization του πραγματικού αντικειμένου
if (realInternet == null) {
realInternet = new RealInternet();
}
// 3. Προώθηση του αιτήματος στο πραγματικό αντικείμενο
realInternet.connectTo(serverHost);
}
} </code>
