Es gibt dasselbe Konzept für Strategy Pattern
und Inheritance
, also kann ich Strategy Pattern
mit Inheritance
implementieren, das klingt, dass es einfacher und sauberer ist als Strategy Pattern
.
Startegy Pattern
:
Inheritance
:
Meine Frage ist, was ist der Unterschied zwischen ihnen? oder wann sollte ich Strategy Pattern
oder Inheritance
verwenden?
Link: Strategie Muster
Stellen Sie sich vor, Sie entwerfen einen Cache. Der Cache kann Optionen bezüglich
habenStellen Sie sich nun vor, Sie möchten, dass der Benutzer Ihres Caches eine dieser Optionen auswählt und Sie die Vererbung verwenden. Du brauchst 3 * 2 * 2 = 12 verschiedene Klassen:
Jede der 4 LifoXxx-Klassen muss denselben Algorithmus zur Implementierung der LIFO-Strategie implementieren. Gleiches gilt für die anderen.
Implementieren Sie es mit dem Strategie-Muster anstelle der Vererbung, und Sie haben eine einzelne Cache-Klasse und sieben Strategieklassen (eine für jede Strategie), die Sie kombinieren können, wie Sie wollen und ohne Code-Duplizierung.
>Und Sie können auch festlegen, dass der Benutzer Ihres Caches seine eigene Strategie definiert, die Sie nicht vorhergesehen haben, und Sie können ihn mit anderen Strategien kombinieren, ohne eine ganze Menge neuer Unterklassen erstellen zu müssen.
Strategie ist ein Muster von OOP und Vererbung ist ein Prinzip von OOP. Die Strategie wird mithilfe der Vererbung implementiert (oder unterstützt diese) (eigentlich die Generalisierung der Schnittstelle).
Vererbung
Strategie
Außerdem, nach Ihrem Beispiel :
Die Antwort finden Sie in dem Wikipedia-Artikel, den Sie in Ihrer Frage verlinkt haben.
Das Strategie-Muster verwendet Komposition statt Vererbung. Im Strategiemuster sind Verhaltensweisen als separate Schnittstellen und spezifische Klassen definiert, die diese Schnittstellen implementieren. Dies ermöglicht eine bessere Entkopplung zwischen dem Verhalten und der Klasse, die das Verhalten verwendet. Das Verhalten kann geändert werden, ohne die Klassen zu unterbrechen, die es verwenden, und die Klassen können zwischen Verhaltensweisen wechseln, indem sie die verwendete Implementierung ändern, ohne dass wesentliche Codeänderungen erforderlich sind. Verhaltensweisen können sowohl zur Laufzeit als auch zur Entwurfszeit geändert werden.
Wenn Ihre Situation einfach und statisch ist, können Sie sicherlich die Vererbung verwenden, aber die Verwendung von Strategie ermöglicht es Ihnen, komplexen Code besser zu entkoppeln und ermöglicht einfaches Umschalten zwischen den Implementierungen der Strategie, sogar zur Laufzeit.
Beispiele können helfen. Es gibt einige gute Antworten in den Antworten auf diese verwandte Frage wie in den anderen Antworten auf Ihre Frage.
Eine sehr reale Situation, in der Sie die Möglichkeit haben, die Strategie zur Laufzeit zu ändern, ist das Sortieren. Die Sortierreihenfolge kann durch eine Strategie (häufig als Komparator bezeichnet) variiert werden, und Sie können mehrere Implementierungen der Strategie und Mechanismen für den Benutzer Ihres Programms verwenden, um sie zu ändern.
Wenn wir über Java sprechen, können Sie auch den Ansatz "Komposition über Vererbung" aus Effektivem Java in Betracht ziehen . Dies wird Ihnen beim Aufruf der Methode helfen, da die Vererbung die Einkapselung (in der allgemeinen Perspektive) verletzt. Durch die Wahl der Komposition können Sie Ihre Abstraktion noch weiter ausbauen, da Sie damit den Grundstein für die von Ihnen benötigte Service-Instanz erhalten.
Tags und Links c++ inheritance design-patterns object-oriented-analysis strategy-pattern