|
auf verschiedenen Ausgabegeräten
|
| |
1. Hierarchie |
Figuren: Punkte, Linien, Kreise, ...
|
| |
2. Hierarchie |
Geräte: X-Fenster, Plotter, PostScript,
...
|
| |
Diagramm |
|
| |
Probleme |
mit der Schnittstelle
|
| |
|
Geräteschnittstelle zu schmal
extrem:
void zeichenPunkt(Punkt p)
|
|
zu viel Arbeit in Figuren-Klassen
|
|
zu ineffizient
|
| |
|
Geräteschnittstelle zu breit
|
|
zu viel Arbeit in Geräte-Klassen
|
|
zu viel Arbeit für ein neues Gerät
|
| |
Ursache |
|
allgemeines Problem |
void zeichen(Figur f, Gerät g)
|
| |
|
Verzweigen (über dynamisches Binden) nicht nur
über den 1. Parameter (OOP: this), sondern
über mehrere.
|
| |
|
Brücke ist manchmal eine Lösung, aber nicht immer.
|
| |
2. Beispiel |
Unterschiedliche
Implementierung von Zahlen
mit beliebig mischbaren Operanden bei der Arithmetik.
|
| |
Spezifikation |
|
|
Brückenmuster ungeeignet
|
| |
Diagramm |
|
| |
|
Lösung in Java mit instanceof-Tests für die Verzweigung über den 2. Parameter
Die Klasse GanzeZahl für die Arithmetik mit einer ganzen Zahl als 1. Parameter.
|
|
|
| |
|
Explosion der # der Hilfs-Methoden:
x + y --> n2 Additions-Methoden
|
| |
|
im Beispiel:
|
|
3 Subklassen
|
|
3 abstrakte Hilfmethoden
|
|
3 Unterklassen mit Implementierungen der Hilfsmethoden
|
|
9 Methoden
|
| |
double dispatch |
oder allgemein multiple dispatch (mehrfaches Verteilen)
bedeutet das dynamische Binden
über zwei oder mehrere Parameter. Dieses kann in C++ und Java nur simuliert werden durch mehrfaches
Hintereinanderschalten von einfachem dynamischem Binden.
|
|
Konsequenz: In C++ und Java viele Hilfsmethoden notwendig.
|
|
Es gibt experimentelle OO-Sprachen, die multiple dispatch unterstützen.
|
|
ein Verhaltensmuster für double dispatch
|