oop:proxy_pattern
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| oop:proxy_pattern [2026/05/25 09:33] – created gthanos | oop:proxy_pattern [2026/05/25 10:55] (current) – [O Client] gthanos | ||
|---|---|---|---|
| Line 17: | Line 17: | ||
| * **Remote Proxy (Απομακρυσμένος Μεσολαβητής): | * **Remote Proxy (Απομακρυσμένος Μεσολαβητής): | ||
| * **Logging/ | * **Logging/ | ||
| + | |||
| + | ===== Παράδειγμα - Caching Proxy ===== | ||
| + | |||
| + | Θα περιγράψουμε το κλασσικό και χρήσιμο παράδειγμα του Proxy caching μηχανισμού μιας βάσης δεδομένων. Σε αυτό το σενάριο, | ||
| + | |||
| + | ==== Το Interface (Subject) ==== | ||
| + | |||
| + | Το // | ||
| + | |||
| + | <code java Database.java> | ||
| + | public interface Database { | ||
| + | String query(String sqlQuery); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Η Bάση Δεδομένων (RealSubject) ==== | ||
| + | |||
| + | Προσομοιώνει μια " | ||
| + | |||
| + | <code java RealDatabase.java> | ||
| + | public class RealDatabase implements Database { | ||
| + | @Override | ||
| + | public String query(String sqlQuery) { | ||
| + | // Προσομοίωση καθυστέρησης της πραγματικής βάσης | ||
| + | System.out.println(" | ||
| + | try { | ||
| + | Thread.sleep(1500); | ||
| + | } catch (InterruptedException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | |||
| + | // Επιστροφή υποτιθέμενων δεδομένων ανάλογα με το ερώτημα | ||
| + | if (sqlQuery.contains(" | ||
| + | return "{id: 1, name: ' | ||
| + | } | ||
| + | return "{No Results found!}"; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== 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< | ||
| + | |||
| + | public ProxyCacheDatabase() { | ||
| + | this.realDatabase = new RealDatabase(); | ||
| + | this.cache = new HashMap<> | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public String query(String sqlQuery) { | ||
| + | System.out.println(" | ||
| + | |||
| + | // 1. Αν το αποτέλεσμα υπάρχει στην Cache, το επιστρέφει ΚΑΤΕΥΘΕΙΑΝ | ||
| + | if (cache.containsKey(sqlQuery)) { | ||
| + | System.out.println(" | ||
| + | return cache.get(sqlQuery); | ||
| + | } | ||
| + | |||
| + | // 2. Αν ΔΕΝ υπάρχει στην Cache (Cache Miss) | ||
| + | System.out.println(" | ||
| + | | ||
| + | // Ρωτάει την πραγματική βάση | ||
| + | String result = realDatabase.query(sqlQuery); | ||
| + | |||
| + | // 3. Αποθηκεύει το νέο αποτέλεσμα στην Cache για το επόμενο request | ||
| + | cache.put(sqlQuery, | ||
| + | System.out.println(" | ||
| + | |||
| + | return result; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== O Client ==== | ||
| + | |||
| + | Θα κάνουμε το ίδιο ερώτημα δύο φορές για να δούμε τη διαφορά στην ταχύτητα. | ||
| + | |||
| + | <code java ClientDB.java> | ||
| + | public class ClientDB { | ||
| + | public static void main(String[] args) { | ||
| + | // Ο Client χρησιμοποιεί τη βάση μέσω του Caching Proxy | ||
| + | Database db = new ProxyCacheDatabase(); | ||
| + | String queryStr = " | ||
| + | |||
| + | // 1η Κλήση: Η cache είναι άδεια, θα πάει στη RealDB (Θα κάνει 1.5 δευτερόλεπτο) | ||
| + | System.out.println(" | ||
| + | long startTime = System.currentTimeMillis(); | ||
| + | String result1 = db.query(queryStr); | ||
| + | long endTime = System.currentTimeMillis(); | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | |||
| + | // 2η Κλήση: Τα δεδομένα υπάρχουν ήδη, θα απαντήσει ο Proxy ακαριαία (0 ms) | ||
| + | System.out.println(" | ||
| + | startTime = System.currentTimeMillis(); | ||
| + | String result2 = db.query(queryStr); | ||
| + | endTime = System.currentTimeMillis(); | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP tip 80% center round> | ||
| + | * **Διαφάνεια: | ||
| + | * **Έλεγχος Ροής:** Ο Proxy προστατεύει τη βαριά βάση από το να δέχεται συνεχώς τα ίδια " | ||
| + | </ | ||
oop/proxy_pattern.1779701589.txt.gz · Last modified: 2026/05/25 09:33 by gthanos
