User Tools

Site Tools


oop:proxy_pattern

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
oop:proxy_pattern [2026/05/25 10:25] – [Περιπτώσεις που χρησιμοποιείται] gthanosoop:proxy_pattern [2026/05/25 10:55] (current) – [O Client] gthanos
Line 18: Line 18:
   * **Logging/Caching Proxy:** Για να κρατάμε ιστορικό (logs) των κλήσεων ή για να αποθηκεύουμε αποτελέσματα (cache) ώστε να μην ξαναεκτελείται μια κοστοβόρα λειτουργία.   * **Logging/Caching Proxy:** Για να κρατάμε ιστορικό (logs) των κλήσεων ή για να αποθηκεύουμε αποτελέσματα (cache) ώστε να μην ξαναεκτελείται μια κοστοβόρα λειτουργία.
  
-===== Παράδειγμα - Protection Internet Proxy =====+===== Παράδειγμα - Caching Proxy =====
  
-Φανταστείτε έναν Server Διαδικτύου (Internet) όπου ορισμένες ιστοσελίδες είναι μπλοκαρισμένες για συγκεκριμένους χρήστες. Ο proxy υπακούει στο παρακάτων //interface//.+Θα περιγράψουμε το κλασσικό και χρήσιμο παράδειγμα του Proxy caching μηχανισμού μιας βάσης δεδομένων. Σε αυτό το σενάριο, ο Proxy μεσολαβεί ανάμεσα στον Client και την πραγματική Βάση Δεδομένων (RealDatabase). Διατηρεί στη μνήμη του έναν [[https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html|HashMap]] που λειτουργεί ως CacheΑκολουθεί η σχηματική υλοποίηση σε Java.
  
-<code java Internet.java> +==== Το Interface (Subject) ==== 
-// Κοινή διεπαφή για το πραγματικό αντικείμενο και τον Proxy + 
-public interface Internet +Το //interface// ορίζει την κοινή λειτουργία αναζήτησης δεδομένων
-    void connectTo(String serverHostthrows Exception;+ 
 +<code java Database.java> 
 +public interface Database 
 +    String query(String sqlQuery);
 } }
 </code> </code>
  
-<code java RealInternet.java> +==== Η Bάση Δεδομένων (RealSubject) ==== 
-// Η πραγματική υπηρεσία που κάνει τη σύνδεση + 
-public class RealInternet implements Internet {+Προσομοιώνει μια "βαριά" βάση δεδομένων που χρειάζεται χρόνο για να απαντήσει (π.χ. λόγω δίσκου ή δικτύου). 
 + 
 +<code java RealDatabase.java> 
 +public class RealDatabase implements Database {
     @Override     @Override
-    public void connectTo(String serverHost) { +    public String query(String sqlQuery) { 
-        System.out.println("Επιτυχής σύνδεση στο+ serverHost);+        // Προσομοίωση καθυστέρησης της πραγματικής βάσης 
 +        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> </code>
  
-</code java ProxyInternet.java> +==== H Proxy Cache Database ====
-import java.util.ArrayList; +
-import java.util.List;+
  
-public class ProxyInternet implements Internet { +Αυτή η κλάση έχει ως πεδίο την πραγματική βάση δεδομένων και ένα HashMap για την προσωρινή αποθήκευση των αποτελεσμάτων (μηχανισμός cache).
-    // Lazy initialization: Το πραγματικό αντικείμενο δημιουργείται μόνο αν χρειαστεί +
-    private RealInternet realInternet; +
-    private static final List<String> bannedSites;+
  
-    // Λίστα με απαγορευμένες ιστοσελίδες +<code java ProxyCacheDatabase.java> 
-    static { +import java.util.HashMap; 
-        bannedSites = new ArrayList<>()+import java.util.Map; 
-        bannedSites.add("facebook.com"); + 
-        bannedSites.add("instagram.com"); +public class ProxyCacheDatabase implements Database { 
-        bannedSites.add("gaming-site.com");+    // Ο Proxy έχει ως πεδίο την πραγματική βάση 
 +    private RealDatabase realDatabase; 
 +    // Η μνήμη Cache για γρήγορη ανάκτηση 
 +    private Map<String, Stringcache
 + 
 +    public ProxyCacheDatabase() { 
 +        this.realDatabase = new RealDatabase(); 
 +        this.cache = new HashMap<>();
     }     }
  
     @Override     @Override
-    public void connectTo(String serverHostthrows Exception +    public String query(String sqlQuery) { 
-        // 1Έλεγχος Ασφάλειας (Protection Logic) +        System.out.println("[ProxyCache] Checking cache first...");
-        if (bannedSites.contains(serverHost.toLowerCase())) { +
-            throw new SecurityException("Πρόσβαση Αρνηθείσα! Το site " + serverHost + " είναι μπλοκαρισμένο."); +
-        }+
  
-        // 2Lazy Initialization του πραγματικού αντικειμένου +        // 1Αν το αποτέλεσμα υπάρχει στην Cache, το επιστρέφει ΚΑΤΕΥΘΕΙΑΝ 
-        if (realInternet == null) { +        if (cache.containsKey(sqlQuery)) { 
-            realInternet = new RealInternet();+            System.out.println("[ProxyCache] HIT! Found in Cache."); 
 +            return cache.get(sqlQuery);
         }         }
  
-        // 3Προώθηση του αιτήματος στο πραγματικό αντικείμενο +        // 2Αν ΔΕΝ υπάρχει στην Cache (Cache Miss) 
-        realInternet.connectTo(serverHost);+        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> </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.1779704757.txt.gz · Last modified: 2026/05/25 10:25 by gthanos