Kann mir bitte jemand erklären, was der Unterschied zwischen dem Muster der Vorlagenmethode und dem Strategiemuster ist?
Soweit ich das beurteilen kann, sind sie zu 99% gleich - der einzige Unterschied besteht darin, dass das Muster der Vorlagenmethode eine abstrakte Klasse als Basisklasse hat, während die Strategieklasse eine Schnittstelle verwendet, die von jeder konkreten Strategieklasse implementiert wird.
Für den Kunden werden sie jedoch genauso konsumiert - ist das richtig?
Antworten:
Der Hauptunterschied zwischen den beiden besteht darin, dass der konkrete Algorithmus gewählt wird.
Beim Muster der Vorlagenmethode geschieht dies zur Kompilierungszeit durch Unterklassen der Vorlage. Jede Unterklasse bietet einen anderen konkreten Algorithmus, indem die abstrakten Methoden der Vorlage implementiert werden. Wenn ein Client Methoden der externen Schnittstelle der Vorlage aufruft, ruft die Vorlage ihre abstrakten Methoden (ihre interne Schnittstelle) nach Bedarf auf, um den Algorithmus aufzurufen.
Im Gegensatz dazu ermöglicht das Strategiemuster die Auswahl eines Algorithmus zur Laufzeit durch Eindämmung . Die konkreten Algorithmen werden durch separate Klassen oder Funktionen implementiert, die als Parameter an ihren Konstruktor oder an eine Setter-Methode an die Strategie übergeben werden. Welcher Algorithmus für diesen Parameter ausgewählt wird, kann je nach Programmstatus oder Eingaben dynamisch variieren.
Zusammenfassend:
quelle
if (config.useAlgoA) impl = new AlgoA() else impl = new AlgoB()
), sodass diese Antwort falsch ist.new ConcreteAlgorithm1()
versus getroffennew ConcreteAlgorithm2()
. Offensichtlich erfolgt die Auswahl zur Laufzeit (eine Auswahl des Algorithmus zur Kompilierungszeit würde eine harte Codierung bedeuten). Der Hauptunterschied zwischen beiden besteht darin, wie der konkrete Algorithmus implementiert wird. Ist es als Unterklasse oder als separate Schnittstelle implementiert? Ersteres ist eine Vorlage. Letzteres ist eine Strategie. Der Unterschied kann als Zusammensetzung gegenüber Vererbung zusammengefasst werden, was ein allgemeines Thema des GoF-Buches ist.Das Vorlagenmuster wird verwendet, wenn eine bestimmte Operation ein unveränderliches Verhalten aufweist, das im Hinblick auf andere unterschiedliche primitive Verhaltensweisen definiert werden kann. Die abstrakte Klasse definiert die invarianten Verhaltensweisen, während die implementierenden Klassen die abhängigen Methoden definieren.
In einer Strategie sind die Verhaltensimplementierungen unabhängig - jede implementierende Klasse definiert das Verhalten und es gibt keinen Code, der zwischen ihnen geteilt wird. Beide sind Verhaltensmuster und werden als solche von Kunden auf die gleiche Weise konsumiert. In der Regel haben Strategien eine einzige öffentliche Methode - die
execute()
Methode, während Vorlagen eine Reihe öffentlicher Methoden sowie eine Reihe unterstützender privater Grundelemente definieren können, die von Unterklassen implementiert werden müssen.Die zwei Muster könnten leicht zusammen verwendet werden. Möglicherweise haben Sie ein Strategiemuster, bei dem mehrere Implementierungen zu einer Familie von Strategien gehören, die mithilfe eines Vorlagenmusters implementiert wurden.
quelle
Ich denke, die Klassendiagramme beider Muster zeigen die Unterschiede.
Strategie
Verkapselt einen Algorithmus innerhalb einer Klasse.
Link zum Bild
Vorlagenmethode
Verschieben Sie die genauen Schritte eines Algorithmus auf eine Unterklasse
Link to Image
quelle
Sie meinen wahrscheinlich Muster der Vorlagenmethode. Sie haben Recht, sie dienen sehr ähnlichen Bedürfnissen. Ich würde sagen, es ist besser, die Vorlagenmethode zu verwenden, wenn Sie einen "Vorlagen" -Algorithmus mit definierten Schritten haben, bei dem Unterklassen diese Schritte überschreiben, um einige Details zu ändern. Im Falle einer Strategie müssen Sie eine Schnittstelle erstellen und anstelle der Vererbung verwenden Sie die Delegierung. Ich würde sagen, es ist ein etwas leistungsfähigeres Muster und vielleicht besser gemäß den DIP-Abhängigkeitsinversionsprinzipien. Es ist leistungsfähiger, weil Sie eine neue Abstraktion der Strategie klar definieren - eine Art, etwas zu tun, die für die Vorlagenmethode nicht gilt. Wenn diese Abstraktion also Sinn macht, verwenden Sie sie. Die Verwendung der Vorlagenmethode kann jedoch in einfachen Fällen zu einfacheren Designs führen, was ebenfalls wichtig ist. Überlegen Sie, welche Wörter besser passen: Haben Sie einen Vorlagenalgorithmus? Oder ist der Schlüssel hier, dass Sie eine Abstraktion der Strategie haben - eine neue Art, etwas zu tun
Beispiel einer Vorlagenmethode:
Hier erben Sie von der Anwendung und ersetzen, was genau auf init, run und done getan wird.
Beispiel einer Strategie:
Hier erben Sie beim Schreiben eines Vergleichers nicht von einem Array. Array delegiert den Vergleichsalgorithmus an einen Vergleicher.
quelle
Ähnlichkeiten
Strategie- und Vorlagenmethodenmuster weisen viele Ähnlichkeiten auf. Sowohl Strategie- als auch Vorlagenmethodenmuster können verwendet werden, um das Open-Closed-Prinzip zu erfüllen und das Softwaremodul einfach zu erweitern, ohne seinen Code zu ändern. Beide Muster repräsentieren die Trennung der generischen Funktionalität von der detaillierten Implementierung dieser Funktionalität. Sie unterscheiden sich jedoch geringfügig in der Granularität, die sie bieten.
Unterschiede
Hier sind einige der Unterschiede, die ich beim Studium dieser beiden Muster beobachtet habe:
Das Bild stammt aus dem beißenden Blog.
quelle
Vererbung versus Aggregation (is-a versus has-a). Es gibt zwei Möglichkeiten, um dasselbe Ziel zu erreichen.
Diese Frage zeigt einige Kompromisse zwischen den Auswahlmöglichkeiten: Vererbung vs. Aggregation
quelle
Beide sind sehr ähnlich und werden vom Client-Code auf ähnliche Weise verwendet. Im Gegensatz zu den oben genannten Antworten ermöglichen beide die Auswahl von Algorithmen zur Laufzeit .
Der Unterschied zwischen den beiden besteht darin, dass das Strategiemuster es verschiedenen Implementierungen ermöglicht, völlig unterschiedliche Wege zum Erreichen des gewünschten Ergebnisses zu verwenden, das Muster der Vorlagenmethode jedoch einen übergreifenden Algorithmus (die "Vorlagen" -Methode) angibt, mit dem das Ergebnis erzielt wird. - Die einzige Möglichkeit für die spezifischen Implementierungen (Unterklassen) sind bestimmte Details der Vorlagenmethode. Dies geschieht, indem die Template-Methode eine oder mehrere abstrakte Methoden aufruft, die von den Unterklassen überschrieben (dh implementiert) werden, im Gegensatz zu der Template-Methode, die selbst nicht abstrakt ist und von den Unterklassen nicht überschrieben wird .
Der Client-Code ruft die Template-Methode mit einem Verweis / Zeiger des abstrakten Klassentyps auf, der auf eine Instanz einer der konkreten Unterklassen verweist, die zur Laufzeit genau wie bei Verwendung des Strategiemusters ermittelt werden kann.
quelle
Vorlagenmethode:
Template_method Struktur:
Strategie:
Strategiestruktur :
Schauen Sie sich zum besseren Verständnis die Artikel zur Vorlagenmethode und zur Strategie an .
Zusammenhängende Posts:
Das Vorlagenentwurfsmuster in JDK konnte keine Methode finden, die eine Reihe von Methoden definiert, die in der angegebenen Reihenfolge ausgeführt werden sollen
Beispiel aus der Praxis für das Strategiemuster
quelle
Nein, sie werden nicht unbedingt auf die gleiche Weise konsumiert. Das Muster "Vorlagenmethode" ist eine Möglichkeit, zukünftigen Implementierern "Anleitung" zu geben. Sie sagen ihnen: "Alle Personenobjekte müssen eine Sozialversicherungsnummer haben" (das ist ein triviales Beispiel, aber es vermittelt die Idee richtig).
Das Strategiemuster ermöglicht das Ein- und Ausschalten mehrerer möglicher Implementierungen. Es wird (normalerweise) nicht durch Vererbung implementiert, sondern indem der Aufrufer die gewünschte Implementierung übergeben wird. Ein Beispiel könnte sein, dass ein ShippingCalculator mit einer von mehreren verschiedenen Methoden zur Berechnung von Steuern ausgestattet werden kann (eine NoSalesTax-Implementierung und möglicherweise eine PercentageBasedSalesTax-Implementierung).
Manchmal teilt der Client dem Objekt tatsächlich mit, welche Strategie verwendet werden soll. Wie in
Der Client würde dies jedoch niemals für ein Objekt tun, das auf der Vorlagenmethode basiert. Tatsächlich weiß der Client möglicherweise nicht einmal, dass ein Objekt auf der Vorlagenmethode basiert. Diese abstrakten Methoden im Muster der Vorlagenmethode sind möglicherweise sogar geschützt. In diesem Fall würde der Client nicht einmal wissen, dass sie vorhanden sind.
quelle
Ich würde Ihnen empfehlen, diesen Artikel zu lesen . Es erklärt die Unterschiede an einem realen Fallbeispiel.
Zitat aus dem Artikel
quelle
Das Vorlagenmuster ähnelt dem Strategiemuster. Diese beiden Muster unterscheiden sich in Umfang und Methodik.
Die Strategie wird verwendet, um Anrufern das Variieren eines gesamten Algorithmus zu ermöglichen, z. B. das Berechnen verschiedener Steuertypen, während die Vorlagenmethode zum Variieren von Schritten in einem Algorithmus verwendet wird. Aus diesem Grund ist die Strategie gröber. Die Vorlage ermöglicht feinkörnigere Steuerelemente in der Reihenfolge der Vorgänge und ermöglicht dennoch, dass die Implementierungen dieser Details variieren.
Der andere Hauptunterschied besteht darin, dass die Strategie die Delegierung verwendet, während die Vorlagenmethode die Vererbung verwendet. In Strategy wird der Algorithmus an eine andere xxxStrategy-Klasse delegiert, auf die der Betreff verweist. Mit Template können Sie jedoch die Basis- und Überschreibungsmethoden unterordnen, um Änderungen vorzunehmen.
von http://cyruscrypt.blogspot.com/2005/07/template-vs-strategy-patterns.html
quelle
In Strategiemustern führen Unterklassen die Show aus und steuern den Algorithmus. Hier wird der Code über die Unterklassen hinweg dupliziert. Das Wissen über den Algorithmus und dessen Implementierung ist auf viele Klassen verteilt.
Im Vorlagenmuster verfügt die Basisklasse über einen Algorithmus. Es maximiert die Wiederverwendung unter den Unterklassen. Da der Algorithmus an einer Stelle liegt, schützt ihn die Basisklasse.
quelle
quelle
Vorlagenmuster:
Bei der Vorlagenmethode geht es darum, Unterklassen bestimmte Schritte des Algorithmus neu definieren zu lassen, ohne die in der Basisklasse definierte Hauptstruktur und die Schritte des Algorithmus zu ändern. Das Vorlagenmuster verwendet normalerweise die Vererbung, sodass eine generische Implementierung von Algorithmen in der Basisklasse bereitgestellt werden kann, die die Unterklasse bei Bedarf möglicherweise überschreibt.
Beachten Sie im obigen Code, dass die Schritte des go () -Algorithmus immer gleich sind, die Unterklassen jedoch möglicherweise ein anderes Rezept für die Ausführung eines bestimmten Schritts definieren.
Strategiemuster:
Beim Strategiemuster geht es darum, den Client zur Laufzeit die Implementierung konkreter Algorithmen auswählen zu lassen. Alle Algorithmen sind isoliert und unabhängig, implementieren jedoch eine gemeinsame Schnittstelle, und es gibt keine Vorstellung davon, bestimmte Schritte innerhalb des Algorithmus zu definieren.
Den vollständigen Quellcode finden Sie in meinem Github- Repository .
quelle
Strategie wird als Schnittstellen- und Vorlagenmethode als abstrakte Klasse verfügbar gemacht. Dies wird normalerweise häufig in Frameworks verwendet. Beispiel: Die MessageSource-Klasse von Spring Framework ist eine Strategie-Schnittstelle zum Auflösen von Nachrichten. Der Client verwendet eine bestimmte Implementierung (Strategie) dieser Schnittstelle.
Und die abstrakte Implementierung derselben Schnittstelle AbstractMessageSource, die eine gemeinsame Implementierung zum Auflösen von Nachrichten hat und die abstrakte Methode resolveCode () verfügbar macht, damit Unterklassen sie auf ihre Weise implementieren können. AbstractMessageSource ist ein Beispiel für eine Vorlagenmethode.
http://docs.spring.io/spring/docs/4.1.7.RELEASE/javadoc-api/org/springframework/context/support/AbstractMessageSource.html
quelle
Bei der Vorlagenmethode dieses Entwurfsmusters können ein oder mehrere Algorithmusschritte von Unterklassen überschrieben werden, um unterschiedliche Verhaltensweisen zuzulassen und gleichzeitig sicherzustellen, dass der übergeordnete Algorithmus weiterhin befolgt wird (Wiki).
Der Mustername Template-Methode bedeutet, was es ist. Angenommen, wir haben eine Methode CalculateSomething () und möchten diese Methode vorlegen. Diese Methode wird in der Basisklasse als nicht virtuelle Methode deklariert. Angenommen, die Methode sieht so aus.
} Die Implementierung der Step1- und Step2-Methoden kann durch abgeleitete Klassen erfolgen.
In Strategy Pattern wird keine Implementierung von der Basis bereitgestellt (Dies ist der Grund, warum die Basis wirklich eine Schnittstelle im Klassendiagramm ist).
Das klassische Beispiel ist das Sortieren. Basierend auf der Anzahl der zu sortierenden Objekte wird die entsprechende Algorithmusklasse (Zusammenführen, Blasen, Schnell usw.) erstellt und der gesamte Algorithmus in jede Klasse eingekapselt.
Können wir nun die Sortierung als Vorlagenmethode implementieren? Sicher können Sie, aber Sie werden nicht viel / keine Gemeinsamkeiten finden, die abstrahiert und in die Basisimplementierung eingefügt werden könnten. Damit wird der Zweck des Template-Methodenmusters zunichte gemacht.
quelle