This shows you the differences between two versions of the page.
|
poo-ca-cd:laboratoare:design-patterns-part-one [2025/11/24 10:44] florian_luis.micu [A treia iterație: Visitor] |
poo-ca-cd:laboratoare:design-patterns-part-one [2025/11/24 11:05] (current) florian_luis.micu [Single Dispatch] |
||
|---|---|---|---|
| Line 683: | Line 683: | ||
| * Overloading nu respectă tipul obiectului la runtime. | * Overloading nu respectă tipul obiectului la runtime. | ||
| * Aceasta nu rezolvă complet problema și nu scalează dacă avem o colecție heterogenă de noduri. | * Aceasta nu rezolvă complet problema și nu scalează dacă avem o colecție heterogenă de noduri. | ||
| + | |||
| + | <note important> | ||
| + | Polimorfismul dinamic **nu** ar avea problema de mai devreme. De exemplu, aceste apeluri sunt rezolvate corect la runtime:<code java> | ||
| + | city.show(); // va apela metoda suprascrisă din City | ||
| + | industry.show(); // va apela metoda suprascrisă din Industry | ||
| + | </code> | ||
| + | |||
| + | Însă această soluție permite **un singur comportament de afișare** per clasă. Dacă vrem să afișăm același obiect în mai multe formate (TEXT, JSON, XML), nu putem suprascrie ''show()'' de trei ori. Ar trebui să delegăm afișarea către clase externe (''ExporterText'', ''ExporterJson'', ''ExporterXml''), iar dacă folosim overloading pentru acestea, revenim la aceeași problemă: **overloading-ul se decide la compile-time**, ignorând tipul real al obiectului. | ||
| + | </note> | ||
| **Concluzie:** | **Concluzie:** | ||
| Line 724: | Line 733: | ||
| <note tip> | <note tip> | ||
| - | Aceasta este situația clasică unde single dispatch și overloading nu sunt suficiente. Avem nevoie de double dispatch. | + | Aceasta este situația clasică unde **single dispatch și overloading nu sunt suficiente**. Avem nevoie de **double dispatch**. |
| </note> | </note> | ||
| Line 833: | Line 842: | ||
| - Operațiile se adaugă mai des decât clasele obiectelor. | - Operațiile se adaugă mai des decât clasele obiectelor. | ||
| - Dorim să separăm algoritmii de structura de date, păstrând clasele vizitabile simple. | - Dorim să separăm algoritmii de structura de date, păstrând clasele vizitabile simple. | ||
| + | |||
| + | **TL;DR:** Folosim Visitor când vrem să avem **mai mulți algoritmi** (ex. ExporterPDF, ExporterXML, ExporterJSON) pentru **mai multe tipuri de entități** (ex. SeightSeeing, Industry, City). | ||
| </note> | </note> | ||