Das Adapterentwurfsmuster wird verwendet, um die Schnittstelle einer Klasse (Ziel) in eine andere Schnittstelle (Adaptee) zu konvertieren, die Clients erwarten. Adapter lässt inkompatible Klassen zusammenarbeiten, die sonst wegen ihrer inkompatiblen Schnittstellen nicht möglich wären.
Das Adaptermuster kann auf zwei Arten implementiert werden: durch Vererbung (Klassenversion des Adaptermusters) und durch Komposition (Objektversion des Adaptermusters).
Meine Frage bezieht sich auf die Klassenversion des Adaptermusters, die mit Vererbung implementiert wird.
Hier ist ein Beispiel für den Zeicheneditor:
%Vor%
Wir möchten die TextView-Klasse wiederverwenden, um TextShape zu implementieren, aber die Schnittstellen sind unterschiedlich und daher können TextView- und Shape-Objekte nicht synonym verwendet werden.
Sollte man die TextView-Klasse so ändern, dass sie der Formschnittstelle entspricht? Vielleicht nicht.
TextShape kann die TextView-Schnittstelle auf zwei Arten an die Schnittstelle der Form anpassen:
Klassenadapter
%Vor%
Nun zur Frage :-). Besteht TextShape von Shape und vor allem von TextView eine gültige "is a" -Beziehung? Und wenn nicht, verstößt es nicht gegen Loskows Substitutionsprinzip ?
Loskovs Substitutionsprinzip ?Es verstößt nicht gegen das Liskow-Substitutionsprinzip, es sei denn, Sie haben etwas in der Unterklasse, das es so verhält, dass es für die Oberklasse nicht sinnvoll ist (Verletzung des Vertrags der Oberklasse). Das ist natürlich ein unvollständiger Code, aber ich sehe kein Anzeichen dafür.
Es könnte gegen das Prinzip der einheitlichen Verantwortlichkeit verstoßen, aber ich bin mir nicht sicher, ob das in einer Adapterimplementierung ein großes Problem ist.
Ich würde im Allgemeinen den Delegierten Weg bevorzugen.
Tags und Links design-patterns adapter