Unterschiede zwischen Strategie und Vererbung

8

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 :

%Vor%

Inheritance :

%Vor%

Meine Frage ist, was ist der Unterschied zwischen ihnen? oder wann sollte ich Strategy Pattern oder Inheritance verwenden?

Link: Strategie Muster

    
Reza Ebrahimi 07.09.2014, 12:42
quelle

4 Antworten

16

Stellen Sie sich vor, Sie entwerfen einen Cache. Der Cache kann Optionen bezüglich

haben
  • Räumungspolitik (LIFO, FIFO, LRU)
  • Ablaufrichtlinie (nach dem Lesen, nach dem Schreiben)
  • maximale Größe (Anzahl der Elemente, Speichernutzung)

Stellen 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:

  • LifoAfterReadNumberOfElementsBasedCache,
  • LifoAfterReadMemoryBasedCache,
  • usw.

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.

    
JB Nizet 07.09.2014, 12:55
quelle
5

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

  • Vererbung wird verwendet, um alle Vorteile von OOP (es schließlich zu erreichen führt zu besserer Lesbarkeit \ Wartbarkeit \ Struktur des Codes.
  • Vererbung wird verwendet, um viele andere Muster zu bilden, nicht nur Strategie
  • Vererbung ist manchmal eine Einschränkung aufgrund ihrer statischen Kompilierzeit

Strategie

  • Die Strategie geht davon aus, verschiedene Implementierungen zu haben, die zur Laufzeit ausgetauscht werden können (oder flexibel konfiguriert werden können). Dein erstes Beispiel ist also auch keine Strategie.
  • Im Allgemeinen wird die Zusammensetzung (die durch die Strategie implementiert wird) als eine Art der logischen Wiederverwendung gegenüber der Vererbung bevorzugt. Zunächst lieferte es dynamischen Polymorphismus. Zweitens hat es weniger Implementierungseinschränkungen wie Mehrklassenvererbung usw.
  • Strategie entspricht "etwas veränderbarem Algorithmus" in Bezug auf DDD, hat also reale Auswirkungen auf Domänenmodellierung.
  • Strategie als Muster selbst bietet eine Sprache ("Mustersprache") für die Kommunikation zwischen Entwicklern.

Außerdem, nach Ihrem Beispiel :

  • Base abstrakte Klasse und Schnittstelle haben zwei verschiedene Semantiken, so Vererbung in Ihrem Beispiel auch unterschiedliche Semantik. Zunächst geht es um die Umsetzung des öffentlichen Auftrags. Zweitens geht es um Verallgemeinerung als eine Extraktion von gemeinsamen Eigenschaften und Methoden.
Valentin P. 07.09.2014 12:58
quelle
4

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.

    
Don Roby 07.09.2014 12:50
quelle
1

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.

    
ekostadinov 08.09.2014 12:52
quelle