Differences

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

Link to this comparison view

poo-ca-cd:laboratoare:design-patterns-part-one [2025/11/24 10:33]
florian_luis.micu [Resurse și link-uri utile]
poo-ca-cd:laboratoare:design-patterns-part-one [2025/11/24 11:05] (current)
florian_luis.micu [Single Dispatch]
Line 636: Line 636:
  
 <code java> <code java>
-package visitor_second_iteration;​ 
- 
 interface Node { interface Node {
     void show();     void show();
Line 685: 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 726: 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 798: Line 805:
 <code java> <code java>
 class NodeVisitor implements Visitor { class NodeVisitor implements Visitor {
-    public void visit(City city) { System.out.println("​Process ​City"​);​ } +    public void visit(City city) { System.out.println("​Export ​City"​);​ } 
-    public void visit(Industry industry) { System.out.println("​Process ​Industry"​);​ } +    public void visit(Industry industry) { System.out.println("​Export ​Industry"​);​ } 
-    public void visit(SightSeeing sightSeeing) { System.out.println("​Process ​SightSeeing"​);​ }+    public void visit(SightSeeing sightSeeing) { System.out.println("​Export ​SightSeeing"​);​ }
 } }
 </​code>​ </​code>​
Line 835: 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>​
  
poo-ca-cd/laboratoare/design-patterns-part-one.1763973219.txt.gz · Last modified: 2025/11/24 10:33 by florian_luis.micu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0