oop:proxy_pattern
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| oop:proxy_pattern [2026/05/25 10:25] – [Περιπτώσεις που χρησιμοποιείται] gthanos | oop:proxy_pattern [2026/05/25 10:55] (current) – [O Client] gthanos | ||
|---|---|---|---|
| Line 18: | Line 18: | ||
| * **Logging/ | * **Logging/ | ||
| - | ===== Παράδειγμα - Protection Internet | + | ===== Παράδειγμα - Caching |
| - | Φανταστείτε έναν Server Διαδικτύου (Internet) όπου ορισμένες ιστοσελίδες | + | Θα περιγράψουμε |
| - | <code java Internet.java> | + | ==== Το Interface (Subject) ==== |
| - | // Κοινή διεπαφή για το πραγματικό | + | |
| - | public interface | + | Το //interface// ορίζει την κοινή λειτουργία αναζήτησης δεδομένων. |
| - | | + | |
| + | <code java Database.java> | ||
| + | public interface | ||
| + | | ||
| } | } | ||
| </ | </ | ||
| - | <code java RealInternet.java> | + | ==== Η Bάση Δεδομένων (RealSubject) ==== |
| - | // Η πραγματική υπηρεσία | + | |
| - | public class RealInternet | + | Προσομοιώνει μια " |
| + | |||
| + | <code java RealDatabase.java> | ||
| + | public class RealDatabase | ||
| @Override | @Override | ||
| - | public | + | public |
| - | System.out.println(" | + | // Προσομοίωση καθυστέρησης της πραγματικής βάσης |
| + | System.out.println(" | ||
| + | try { | ||
| + | Thread.sleep(1500); | ||
| + | } catch (InterruptedException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | |||
| + | // Επιστροφή υποτιθέμενων δεδομένων ανάλογα με το ερώτημα | ||
| + | if (sqlQuery.contains(" | ||
| + | return "{id: 1, name: ' | ||
| + | } | ||
| + | return "{No Results found!}" | ||
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | </code java ProxyInternet.java> | + | ==== H Proxy Cache Database ==== |
| - | import java.util.ArrayList; | + | |
| - | import java.util.List; | + | |
| - | public class ProxyInternet implements Internet { | + | Αυτή η κλάση έχει ως πεδίο την |
| - | // Lazy initialization: | + | |
| - | private RealInternet realInternet; | + | |
| - | private static final List< | + | |
| - | | + | <code java ProxyCacheDatabase.java> |
| - | | + | import java.util.HashMap; |
| - | bannedSites = new ArrayList<>(); | + | import java.util.Map; |
| - | | + | |
| - | | + | public class ProxyCacheDatabase implements Database { |
| - | | + | |
| + | private RealDatabase realDatabase; | ||
| + | // Η μνήμη Cache για γρήγορη ανάκτηση | ||
| + | | ||
| + | |||
| + | public ProxyCacheDatabase() { | ||
| + | | ||
| + | | ||
| } | } | ||
| @Override | @Override | ||
| - | public | + | public |
| - | | + | |
| - | if (bannedSites.contains(serverHost.toLowerCase())) { | + | |
| - | throw new SecurityException("Πρόσβαση Αρνηθείσα! Το site " + serverHost + " είναι μπλοκαρισμένο."); | + | |
| - | } | + | |
| - | // 2. Lazy Initialization | + | // 1. Αν το αποτέλεσμα υπάρχει στην Cache, |
| - | if (realInternet == null) { | + | if (cache.containsKey(sqlQuery)) { |
| - | | + | |
| + | return cache.get(sqlQuery); | ||
| } | } | ||
| - | // 3. Προώθηση του αιτήματος στο | + | // 2. Αν ΔΕΝ υπάρχει |
| - | | + | System.out.println(" |
| + | |||
| + | // Ρωτάει την πραγματική βάση | ||
| + | String result = realDatabase.query(sqlQuery); | ||
| + | |||
| + | // 3. Αποθηκεύει | ||
| + | | ||
| + | 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.1779704757.txt.gz · Last modified: 2026/05/25 10:25 by gthanos
