User Tools

Site Tools


oop:adapter_pattern

Differences

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

Link to this comparison view

Next revision
Previous revision
oop:adapter_pattern [2026/05/24 20:59] – created gthanosoop:adapter_pattern [2026/05/24 21:08] (current) – [WindowAdapter, MouseAdapter (στο java.awt.event)] gthanos
Line 89: Line 89:
  
   * **Το πρόβλημα:** Έχεις έναν κλασικό πίνακα (Array), αλλά θέλεις να τον περάσεις σε μια μέθοδο που δέχεται μια λίστα (List), για να μπορείς να χρησιμοποιήσεις μεθόδους των Collections (όπως αναζήτηση, streams κλπ).   * **Το πρόβλημα:** Έχεις έναν κλασικό πίνακα (Array), αλλά θέλεις να τον περάσεις σε μια μέθοδο που δέχεται μια λίστα (List), για να μπορείς να χρησιμοποιήσεις μεθόδους των Collections (όπως αναζήτηση, streams κλπ).
-  * **Η λύση (Adapter):** Η μέθοδος Arrays.asList() λειτουργεί ως προσαρμογέας. Παίρνει τον πίνακα και επιστρέφει μια List η οποία "κάθεται" πάνω από τον πίνακα. Κάθε αλλαγή στη λίστα επηρεάζει τον πίνακαεπειδή η λίστα είναι απλώς ένα "προσωρείο" (interface adapter) πάνω από τον πίνακα.+  * **Η λύση (//Adapter//):** Η μέθοδος ''Arrays.asList()'' λειτουργεί ως προσαρμογέας. Παίρνει τον πίνακα και επιστρέφει μια List η οποία "κάθεται" πάνω από τον πίνακα.  
 + 
 +==== java.io.InputStreamReader και java.io.OutputStreamWriter ==== 
 + 
 +Εδώ έχουμε μια κλασική περίπτωση όπου πρέπει να γεφυρωθούν δύο εντελώς διαφορετικοί τρόποι διαχείρισης δεδομένων: τα Bytes (δυαδικά δεδομένα) και οι Characters (χαρακτήρες/κείμενο). 
 +  * **Το πρόβλημα:** Έχεις ένα stream που διαβάζει ωμά bytes (π.χ. FileInputStream ή System.in), αλλά εσύ θέλεις να το διαβάσεις ως κείμενο/χαρακτήρες (Reader). 
 +  * **Η λύση (Adapter):** Ο InputStreamReader λειτουργεί ως Adapter. Δέχεται ως παράμετρο στον κατασκευαστή του ένα InputStream (που παράγει bytes) και το προσαρμόζει στο interface ενός Reader (που παράγει χαρακτήρες), κάνοντας εσωτερικά τη μετάφραση (//decoding//) με βάση κάποιο encoding (π.χ. UTF-8). Υπάρχουν παραλαγές του κατασκευαστή που ορίζουν το char-set που θα χρησιμοποιηθεί αν δεν θέλουμε το //default// του συστήματος. 
 + 
 +==== WindowAdapter, MouseAdapter (στο java.awt.event) ==== 
 + 
 +Αυτή είναι μια ελαφρώς διαφορετική παραλλαγή που ονομάζεται Convenience Adapter. 
 + 
 +  * **Το πρόβλημα:** Το interface ''MouseListener'' έχει 5 μεθόδους (mouseClicked, mousePressed, mouseReleased, mouseEntered, mouseExited). Αν ο προγραμματιστής θέλει να γράψει κώδικα μόνο για το click, η Java θα τον ανάγκαζε να κάνει override και τις 5 μεθόδους, αφήνοντας τις 4 κενές, γεμίζοντας τον κώδικα με "θόρυβο"
 +  * **Η λύση (Adapter):** Η Java παρέχει την κλάση ''MouseAdapter''. Αυτή η κλάση υλοποιεί το //interface// ''MouseListener'' και δίνει κενές (empty) υλοποιήσεις για όλες τις μεθόδους. Κληρονομείς τον //MouseAdapter// και κάνεις //override// μόνο τη μέθοδο που σε ενδιαφέρει, αγνοώντας τις υπόλοιπες. 
 + 
 +<code java> 
 +// Αντί για "implements MouseListener" (που θέλει 5 μεθόδους) 
 +// χρησιμοποιούμε τον MouseAdapter και γράφουμε μόνο μία 
 +button.addMouseListener(new MouseAdapter() { 
 +    @Override 
 +    public void mouseClicked(MouseEvent e) { 
 +        System.out.println("Left mouse button clicked!"); 
 +    } 
 +}); 
 +</code> 
  
  
oop/adapter_pattern.1779656364.txt.gz · Last modified: 2026/05/24 20:59 by gthanos