User Tools

Site Tools


oop:proxy_pattern

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
oop:proxy_pattern [2026/05/25 09:33] – created gthanosoop:proxy_pattern [2026/05/25 10:55] (current) – [O Client] gthanos
Line 17: Line 17:
   * **Remote Proxy (Απομακρυσμένος Μεσολαβητής):** Όταν το πραγματικό αντικείμενο βρίσκεται σε διαφορετικό reference space (π.χ. σε άλλον server) και ο Proxy αναλαμβάνει τη δικτυακή επικοινωνία (RMI, RPC).   * **Remote Proxy (Απομακρυσμένος Μεσολαβητής):** Όταν το πραγματικό αντικείμενο βρίσκεται σε διαφορετικό reference space (π.χ. σε άλλον server) και ο Proxy αναλαμβάνει τη δικτυακή επικοινωνία (RMI, RPC).
   * **Logging/Caching Proxy:** Για να κρατάμε ιστορικό (logs) των κλήσεων ή για να αποθηκεύουμε αποτελέσματα (cache) ώστε να μην ξαναεκτελείται μια κοστοβόρα λειτουργία.   * **Logging/Caching Proxy:** Για να κρατάμε ιστορικό (logs) των κλήσεων ή για να αποθηκεύουμε αποτελέσματα (cache) ώστε να μην ξαναεκτελείται μια κοστοβόρα λειτουργία.
 +
 +===== Παράδειγμα - Caching Proxy =====
 +
 +Θα περιγράψουμε το κλασσικό και χρήσιμο παράδειγμα του Proxy caching μηχανισμού μιας βάσης δεδομένων. Σε αυτό το σενάριο, ο Proxy μεσολαβεί ανάμεσα στον Client και την πραγματική Βάση Δεδομένων (RealDatabase). Διατηρεί στη μνήμη του έναν [[https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html|HashMap]] που λειτουργεί ως Cache. Ακολουθεί η σχηματική υλοποίηση σε Java.
 +
 +==== Το Interface (Subject) ====
 +
 +Το //interface// ορίζει την κοινή λειτουργία αναζήτησης δεδομένων.
 +
 +<code java Database.java>
 +public interface Database {
 +    String query(String sqlQuery);
 +}
 +</code>
 +
 +==== Η Bάση Δεδομένων (RealSubject) ====
 +
 +Προσομοιώνει μια "βαριά" βάση δεδομένων που χρειάζεται χρόνο για να απαντήσει (π.χ. λόγω δίσκου ή δικτύου).
 +
 +<code java RealDatabase.java>
 +public class RealDatabase implements Database {
 +    @Override
 +    public String query(String sqlQuery) {
 +        // Προσομοίωση καθυστέρησης της πραγματικής βάσης
 +        System.out.println("[RealDB] Searching on database for: \"" + sqlQuery + "\"...");
 +        try {
 +            Thread.sleep(1500); // Καθυστέρηση 1.5 δευτερολέπτου
 +        } catch (InterruptedException e) {
 +            e.printStackTrace();
 +        }
 +
 +        // Επιστροφή υποτιθέμενων δεδομένων ανάλογα με το ερώτημα
 +        if (sqlQuery.contains("id = 1")) {
 +            return "{id: 1, name: 'Mickey Mouse'}";
 +        }
 +        return "{No Results found!}";
 +    }
 +}
 +</code>
 +
 +==== H Proxy Cache Database ====
 +
 +Αυτή η κλάση έχει ως πεδίο την πραγματική βάση δεδομένων και ένα HashMap για την προσωρινή αποθήκευση των αποτελεσμάτων (μηχανισμός cache).
 +
 +<code java ProxyCacheDatabase.java>
 +import java.util.HashMap;
 +import java.util.Map;
 +
 +public class ProxyCacheDatabase implements Database {
 +    // Ο Proxy έχει ως πεδίο την πραγματική βάση
 +    private RealDatabase realDatabase;
 +    // Η μνήμη Cache για γρήγορη ανάκτηση
 +    private Map<String, String> cache;
 +
 +    public ProxyCacheDatabase() {
 +        this.realDatabase = new RealDatabase();
 +        this.cache = new HashMap<>();
 +    }
 +
 +    @Override
 +    public String query(String sqlQuery) {
 +        System.out.println("[ProxyCache] Checking cache first...");
 +
 +        // 1. Αν το αποτέλεσμα υπάρχει στην Cache, το επιστρέφει ΚΑΤΕΥΘΕΙΑΝ
 +        if (cache.containsKey(sqlQuery)) {
 +            System.out.println("[ProxyCache] HIT! Found in Cache.");
 +            return cache.get(sqlQuery);
 +        }
 +
 +        // 2. Αν ΔΕΝ υπάρχει στην Cache (Cache Miss)
 +        System.out.println("[ProxyCache] MISS! No data found in Cache. Connecting to RealDB...");
 +        
 +        // Ρωτάει την πραγματική βάση
 +        String result = realDatabase.query(sqlQuery);
 +
 +        // 3. Αποθηκεύει το νέο αποτέλεσμα στην Cache για το επόμενο request
 +        cache.put(sqlQuery, result);
 +        System.out.println("[ProxyCache] Updated cache.");
 +
 +        return result;
 +    }
 +}
 +</code>
 +
 +==== O Client ====
 +
 +Θα κάνουμε το ίδιο ερώτημα δύο φορές για να δούμε τη διαφορά στην ταχύτητα.
 +
 +<code java ClientDB.java>
 +public class ClientDB {
 +    public static void main(String[] args) {
 +        // Ο Client χρησιμοποιεί τη βάση μέσω του Caching Proxy
 +        Database db = new ProxyCacheDatabase();
 +        String queryStr = "SELECT * FROM users WHERE id = 1";
 +
 +        // 1η Κλήση: Η cache είναι άδεια, θα πάει στη RealDB (Θα κάνει 1.5 δευτερόλεπτο)
 +        System.out.println("\n=== 1st Attempt (Empty Cache) ===");
 +        long startTime = System.currentTimeMillis();
 +        String result1 = db.query(queryStr);
 +        long endTime = System.currentTimeMillis();
 +        System.out.println("Result: " + result1);
 +        System.out.println("Exec time: " + (endTime - startTime) + " ms\n");
 +
 +        // 2η Κλήση: Τα δεδομένα υπάρχουν ήδη, θα απαντήσει ο Proxy ακαριαία (0 ms)
 +        System.out.println("=== 2nd Attempt (Found in Cache) ===");
 +        startTime = System.currentTimeMillis();
 +        String result2 = db.query(queryStr);
 +        endTime = System.currentTimeMillis();
 +        System.out.println("Result: " + result2);
 +        System.out.println("Exec time: " + (endTime - startTime) + " ms");
 +    }
 +}
 +</code>
 +
 +<WRAP tip 80% center round>
 +  * **Διαφάνεια:** Ο Client καλεί απλά την db.query(). Δεν τον νοιάζει αν τα δεδομένα ήρθαν από τη μνήμη RAM του Proxy ή από τον σκληρό δίσκο της RealDB.
 +  * **Έλεγχος Ροής:** Ο Proxy προστατεύει τη βαριά βάση από το να δέχεται συνεχώς τα ίδια "κουραστικά" ερωτήματα, βελτιώνοντας δραματικά την ταχύτητα της εφαρμογής.
 +</WRAP>
  
  
  
  
oop/proxy_pattern.1779701589.txt.gz · Last modified: 2026/05/25 09:33 by gthanos