Wo liegt der Vorteil darin, ein Interface als Instanzvariable in einer Klasse zu erstellen anstatt das Interface einfach zu implementieren?
(so z.B. bei der mir vorliegenden Vorstellung des Strategy-Pattern)
Ich bin mir nicht sicher, ob ich dich richtig verstehe.
Du willst wissen, wieso ich das Quaken der Ente nicht direkt in der Ente implementiere sondern statt dessen ein Interface dafür habe um dieses dann in eigenenständigen Klassen zu implementieren und dann bekommt die Ente eine entsprechende Instanz?
Das wird in dem Buch Entwurfsmuster von Kopf bis Fuß doch recht gut erklärt.
Das Problem in dem Buch war - so ich mich richtig erinnere - dass Enten quaken können sollen. Aber es gibt viele unterschiedliche Arten von Enten: Die lebende Ente, die "Badeente" deren Quaken dann mehr ein Quietschen ist, eine Holzente (deren Quaken dann vermutlich gar nichts ist) u.s.w.
==> Es gibt also nicht ein Verhalten in Ente sondern es gibt ganz viele
Dann könnte man es natürlich abstrakt machen in Ente und die ableitenden Klassen würden es dann implementieren.
Dann kommt aber das nächste Problem: zwei konkrete Klassen, die von Ente erben, haben das gleiche Quaken. Bei dem oben genannten Ansatz führt das zu einem Problem. Man kann sich da zwar noch mit eine weiteren Zwischenklasse behelfen, von der die dann beide erben, aber das geht nicht, sobald es mehrere Verhalten gibt:
Ich habe also eine Basisklasse "Basisklasse" mit den abstrakten Verhalten a und b
Für a gibt es diverse Implementationen: A1, A2, A3, ....
Ebenso für b: B1, B2, B3, ...
Nun habe ich abgeleitete Klassen: AKlasse1 braucht A1 und B1, AKlasse2 braucht A1 und B2, AKLasse3 braucht A2 und B2, ...
Wo packst Du nun die Implementationen hin? Doppelten Code will man ja nicht haben. Hier kann man dann auch sehr gut sehen, wie man ohne Strategy Pattern zu kennen sowas bauen kann: Die Klassen haben dann halt die Implementationen. A1, A2, B1, B2 sind dann konkrete Methoden. Diese sind dann natürlich doppelt. Doppelter Code bedeutet, dass man das heraus zieht und dann aufruft. In diesem Fall ziehen wir die Methode also heraus und rufen es dann auf. Man kommt da also relativ gut eben zu genau dem Aufbau - auch wenn man das Pattern nicht kennt.
War das etwas verständlich?