| Next revision | Previous revision |
| oop:adapter_pattern [2026/05/24 20:59] – created gthanos | oop:adapter_pattern [2026/05/24 21:08] (current) – [WindowAdapter, MouseAdapter (στο java.awt.event)] gthanos |
|---|
| |
| * **Το πρόβλημα:** Έχεις έναν κλασικό πίνακα (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> |
| |
| |