Kann mir jemand einige Beispielsituationen sagen, in denen Template Method - Muster verwendet werden sollten?
Geben Sie mir aus Ihrer eigenen Erfahrung einen echten Nutzen.
(Ich habe es bisher nur für das Mapping von Daten in der DA-Ebene nützlich gefunden. Entschuldigung !!!)
Ich habe versucht, Ihnen einige Beispiele aus der Praxis zu geben und einige häufige Situationen, in denen das Template Method-Muster verwendet werden sollte.
Wenn Sie möchten, dass Ihr Programm "Open For Extension" und auch "Closed for Modification" ist. Dies bedeutet, dass das Verhalten des Moduls erweitert werden kann, so dass das Modul sich verhalten kann Neue und unterschiedliche Wege, wie sich die Anforderungen der Anwendung ändern, oder um den Anforderungen neuer Anwendungen zu entsprechen.Der Quellcode eines solchen Moduls ist jedoch unantastbar.Niemand darf Quellcodeänderungen daran vornehmen kann eine neue Art der Gehaltsberechnung hinzufügen (z. B. Remotely-Klasse), ohne die vorherigen Codes zu ändern.
public abstract class Gehalt {
%Vor%}
öffentliche Klasse stündlich verlängert Gehalt {
%Vor%}
public class Test {
%Vor%}
Wenn Sie mit derselben Codezeile konfrontiert werden, die dupliziert wird, indem Sie nur einige Schritte Ihres Algorithmus verschieben. Wenn Sie den Inhalt einer Methode oder Funktion implementieren, finden Sie einen Abschnitt Ihrer Code, die von einem Typ zu einem anderen Typ variieren. Das Merkmal dieser Abschnitte ist, dass man diese Abschnitte einer Methode oder Funktion neu definieren oder ändern kann, ohne die Hauptstruktur des Algorithmus (Methode oder Funktion) zu ändern. Zum Beispiel, wenn Sie dieses Problem ohne dieses Muster lösen wollen, sehen Sie sich dieses Beispiel an:
funktion0: funktion1: ... funktionN:
%Vor%Wie Sie sehen können, unterscheiden sich die Abschnitte cods 5, 6, n von Funktion zu Funktion. Sie haben jedoch Bereiche wie 1,2,3,4 geteilt, die dupliziert haben. Betrachten wir eine Lösung mit einer der berühmten Java-Bibliotheken.
%Vor%Wenn Sie als Designer eines Frameworks möchten, dass Ihre Clients nur ausführbaren Code verwenden, der als Argument an Ihr Framework übergeben wird und von dem erwartet wird, dass dieses Argument zu einem bestimmten Zeitpunkt aufgerufen (ausgeführt) wird . Diese Ausführung kann unmittelbar wie bei einem synchronen Rückruf sein oder zu einem späteren Zeitpunkt wie bei einem asynchronen Rückruf. Betrachten wir einen der berühmten.
Öffentliche abstrakte Klasse HttpServlet erweitert GenericServlet implementiert java.io.Serializable { protected void doGet (HttpServletRequest req, HttpServletResponse resp) { ... }
%Vor%}
Öffentliche Klasse MyServlet erweitert HttpServlet {
%Vor%}
Ein Template-Methodenmuster bietet ein Gerüst für die Ausführung beliebiger Algorithmen oder Operationen und ermöglicht den Unterklassen, einen Teil der Logik neu zu definieren.
Vorteile: Natürliche Anpassung für den Aufbau von Frameworks, so dass übergeordnete Framework-Klassen Rückrufe in Methoden ausführen können, die in child implementiert sind.
Beispiele:
Nachteile: Schränkt Sie auf eine einzige Vererbung in Java ein.
Eine Anwendung des Schemas Vorlagenmethode hat zwei Hauptmerkmale:
protected
-Konstruktoren und optional als abstract
deklariert), die im Client-Code unterklassifiziert wird. final
, in Java); seine API-Dokumentation muss genau angeben, welche primitiven Operationsmethoden sie aufrufen und wann (dh, sie muss den "Algorithmus" beschreiben). Eine primitive Operationsmethode, die einen Schritt im Algorithmus darstellt, sollte nicht öffentlich, sondern überschreibbar sein ( protected
, in Java) und kann zwei Typen umfassen: a) eine abstrakte Methode, die muss in der Unterklasse implementiert werden; b) eine Methode mit einer default / empty-Implementierung, die in der Unterklasse überschrieben werden darf. Ein gutes Beispiel im Java 6 SDK ist die Methode execute()
der Klasse javax.swing.SwingWorker
(es ist eine Methode public final void
). In diesem Fall sind die primitiven Operationsmethoden doInBackground()
, process(List)
und done()
. Die erste ist abstrakt und erfordert daher eine Implementierung in der Unterklasse; Es wird von der Template-Methode in einem Hintergrundthread aufgerufen. Die anderen beiden haben leere Implementierungen und können optional in der Unterklasse überschrieben werden; Sie werden während und am Ende der Verarbeitung im EDT (Swing Event Dispatch Thread) aufgerufen, um Aktualisierungen der Benutzeroberfläche zu ermöglichen.
Nach meiner eigenen Erfahrung habe ich manchmal dieses Muster benutzt.
Ein solcher Fall war eine Java-Basisklasse, die die java.util.Iterator
-Schnittstelle implementierte, wobei next()
die Schablonenmethode war und es nur eine primitive Operationsmethode gab, die für die Instantiierung einer bestimmten Domänenentitätsklasse verantwortlich war (dies sollte beim Iterieren über eine Liste persistenter Domänenentitätsobjekte mit JDBC).
Ein besseres Beispiel in der gleichen Anwendung war eine Basisklasse, bei der die Template-Methode einen mehrstufigen Algorithmus implementiert hat, um einen "Business Entity Maintenance Screen" (mit Swing) aus einer gegebenen Liste persistenter Entitäten zu füllen; Primitive Operationsmethoden wurden aufgerufen, um 1) den aktuellen Bildschirmzustand zu löschen und 2) eine Entität in einer Tabellenansicht innerhalb des Bildschirms hinzuzufügen; Optional wurden andere primitive Operationen von der Template-Methode aufgerufen, wenn der Bildschirm editierbar war.
Am Ende muss ich sagen, dass, obwohl dies sicherlich ein nützliches Designmuster ist, nicht so oft eine Situation dort auftaucht, wo sie wirklich anwendbar ist. Einfach eine Basisklasse mit Methoden zu haben, die in einer Unterklasse überschrieben werden (eine viel häufigere Situation, nach meiner Erfahrung), reicht allein nicht aus, um als eine Anwendung des Musters zu gelten.
Das Wichtigste in der Template-Methode ist, dass Sie eine Reihe von abstrakten Methoden als Schritte oder einen Algorithmus definieren müssen und die Subklasse durch die konkrete Implementierung für diese Methoden ersetzen soll.
Ich habe mich in einem der Dokumentgenerierungsprogramme beworben.
%Vor%Sie können verschiedene Implementierungen wie PDF-Generator-CSV-Generator haben und der Wert ist hier, dass sie mit dem Algorithmus übereinstimmen (generieren - & gt; Header, Körper, Details).
Wenn ein Algorithmus mit vielen Implementierungen vorhanden ist, sollte ein Vorlagenmuster verwendet werden. Der Algorithmus ist in einer Funktion in der Basisklasse definiert und die Implementierung wird von der Basisklasse und den Unterklassen durchgeführt. Eine detaillierte Erklärung mit einem Echtzeit-Beispiel finden Sie in Ссылка
Ich werde ein Beispiel aus der realen Welt skizzieren, in dem ich einige Template-Methoden verwendet habe.
In einer C ++ - Computer-Vision-Algorithmus-Anwendung wurde das Verhalten des Algorithmus so ausgelegt, dass einige Verhaltensweisen des Algorithmus basierend auf einigen Optionen zur Laufzeit gemäß einer Enumeration in einer beim Start geladenen Konfigurationsdatei übernommen wurden. Das Gesamtskelett des Algorithmus war identisch, abgesehen von einigen Schlüsselrückrufen, die mitten in einem ansonsten identischen Codeabschnitt gestopft waren, der brutal dupliziert werden würde, nur um verschiedene Funktionen auf dieser Ebene aufzurufen. Diese Callbacks, die ich verwenden wollte, wurden in die Template-Methoden-Basisklasse abstrahiert und das Template-Methodenmuster verhinderte die gesamte Code-Duplizierung. Die Enumeration, die wir verwendeten, diktierte im Grunde, welche Unterklasse ich instanziiert hatte, um meinen Basisklassenzeiger zu zeigen und damit dem Algorithmus sein zugeordnetes Geschmacksarsenal im Verhalten zu verleihen.
Einige der Beweggründe hinter dieser Vielfalt von Varianten des laufenden Algorithmus waren eine Online- und eine Offline-Funktionalität von Software, die unser Instrument steuert. Der Offline-Flavour zog mit ihm eine umfangreichere Debug / Diagnose-Ausgabe und behielt ein lokales Koordinatensystem für einige Bildpixel, während der Online-Flavor Dinge in einem absoluten Koordinatenraum behielt und Bedenken bezüglich des laufenden Instruments mit all seinen Robotern und was nicht behielt. Ein anderes enum führte zu einer Auswahl von Klassifikatoren, die wir für ein maschinelles Lernen verwendeten, da verschiedene Klassifikatoren unter verschiedenen Datensätzen trainiert wurden, die ansonsten identisch durch den Code-Code flossen, aber basierend auf einigen Bedingungen für die Interpretation unterschiedlich interpretiert werden mussten diese Daten wurden erstellt.
Ich glaube, dass diese Art von Anwendungsfall aus dem entstand, was man als Loch in der Mitte Problem.
Die Template-Methode definiert die Skelettstruktur eines Algorithmus aber verschiebt bestimmte Schritte und Details zu Unterklassen. Die Struktur und die Ablauf des Algorithmus bleiben statisch, aber die Details der Schritte sind auf Unterklassen verschoben.
Ich habe Vorlagenmuster verwendet, um den Dokumentinhalt vorzubereiten. Es gab viele verschiedene Arten von Dokumenten, bei denen jeder Typ seine eigenen kleinen Modifikationen hat. Der Hauptprozess der Dokumentenvorbereitung war jedoch für alle gleich.
Tags und Links design-patterns template-method-pattern