Frage

Kann jemand lassen Sie mich wissen, einige Beispiel Situationen, in denen Template-Methode - Muster verwendet werden soll

Geben Sie mir etwas realen Einsatz aus eigener Erfahrung.

(ich habe so weit es für sinnvoll nur für die Zuordnung von Daten in der DA-Schicht. Leider !!!)

War es hilfreich?

Lösung

Ich habe versucht, einige reale Beispiele zu geben, und einige allgemeine Situationen, in denen Template Method-Muster verwendet werden soll.

  • Wenn Sie Ihr Programm wollen sein „Open For Extension“ und auch ‚geschlossen für Änderung‘. Dies bedeutet, dass das Verhalten des Moduls erweitert werden kann, so dass wir machen die Modul verhalten sich in neue und andere Möglichkeiten, wie die Anforderungen der Anwendung zu ändern oder die Anforderungen neuer Anwendungen gerecht zu werden. jedoch der Quellcode eines solchen Moduls unverletzlich ist. Niemand darf zu Änderungen am Quellcode machen. in folgenden so können Sie zB neue Art und Weise der Gehaltsberechnung (wie Remotely Klasse) hinzuzufügen, ohne die vorherigen Codes zu ändern.

    public abstract class Salary {
    
       public final void calculate() {
            System.out.println("First shared tasks is done.");
            getBaseSalary();
            System.out.println("Second shared tasks is done.");
       }
    
       public abstract void getBaseSalary();
    
    }
    
    public class Hourly extends Salary {
    
        @Override
        public void getBaseSalary() {
            System.out.println("Special Task is done.");
        }
    
    }
    
    public class Test {
    
        public static void main(String[] args) {
            Salary salary = ....
            salary.calculate();
        }
    }
    
  • Wenn Sie viele gleiche Linie von Codes gegenüber, die durch Aufschieben nur ein paar Schritte Ihres Algorithmus dupliziert werden. Wenn Sie Inhalte einer Methode oder Funktion implementieren Sie können einige Abschnitt Ihrer finden Code, der von einem Typ in einen anderen Typ variieren. Das Merkmal dieser Abschnitte sind, dass man diese Abschnitte einer Methode oder Funktion neu zu definieren oder ändern kann der Algorithmus (Methode oder Funktion) Hauptstruktur ohne Änderung. Zum Beispiel, wenn Sie dieses Problem ohne dieses Muster lösen Sie diese Probe stellen werden:

function0: function1: ... Funktionenn:

1       1               1
2       2               2
...     ...             ...
5       6               n
3       3               3
4       4               4
...     ...             ...

Wie Sie sehen können, cods Abschnitt 5, 6, n sind unterschiedlich variieren von einer Funktion auf eine andere Funktion, jedoch haben Sie gemeinsam genutzten Abschnitte wie 1,2,3,4, die dupliziert werden. Ermöglicht eine Lösung mit einem der bekannten Java-Bibliotheken betrachten.

public abstract class InputStream implements Closeable {

    public abstract int read() throws IOException;

    public int read(byte b[], int off, int len) throws IOException {
        ....

        int c = read();
        ....
    }

    ....

}

public class ByteArrayInputStream extends InputStream {  

    ...

    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
        }
    ...
}
  • Wenn Sie als Designer eines Rahmens, wollen, dass Ihre Kunden nur jeden ausführbaren Code verwenden, die als Argument an Ihren Rahmen übergeben wird, die zurückrufen zu erwarten ist (execute) dieses Argument an eine bestimmte Zeit. Diese Ausführung wie in einem synchronen Rückruf sofort sein kann, oder es könnte zu einem späteren Zeitpunkt als in einem asynchronen Rückruf passieren. Lässt eines der bekanntesten in Betracht ziehen.

    public abstract class HttpServlet extends GenericServlet 
        implements java.io.Serializable  {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
            ...
        }
    
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
            ....
            doGet(req, resp);
            ...
        }
        ...
    }
    }
    
    public class MyServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    
                //do something
            ...
        }
        ...
    }
    

Andere Tipps

A Schablonenmethode ein Skelett für jede Art von Algorithmus durchführt oder einer Operation, und es erlaubt, die Unterklassen auf einen Teil der Logik neu definieren.

Pros:. Natürliche Passform für Gerüste bauen, so dass Eltern Framework-Klassen-Rückrufe in Methoden in den Kindern umgesetzt macht

Beispiele:

  • java.util.AbstractList
  • Servlets doGet und doPost Methoden
  • MDB-Blöcke onMessage Methode
  • Struts Action-Klasse
  • Spring Datenzugriffsklassen

Nachteile:. Beschränkt man auf eine einzelne Vererbung in Java

Eine Anwendung der Template-Methode Muster hat zwei Hauptmerkmale:

  1. Es ist eine Basisklasse (in Java, eine nur mit protected Konstrukteuren und optional als abstract erklärt), die in Client-Code subclassed werden.
  2. Es gibt zwei Gruppen von Methoden in der Basisklasse definiert: a) ein oder mehr template Methoden (in der Regel nur ein) und ein oder mehr primitive Operation Methoden (in der Regel mehr als ein). Jede Vorlage Verfahren stellt einen hohen Betrieb in der Basisklasse implementiert mich in Bezug auf den Grundoperationen, die durchgeführt werden sollen / in jeder spezifischen Unterklasse außer Kraft gesetzt. Normalerweise wird die Template-Methode öffentliche und nicht-überschreibbare (final, in Java); seine API Unterlagen müssen genau, welche primitive Operationsmethoden geben sie aufruft, und wenn (das heißt, es muß den „Algorithmus“ beschreiben). Eine primitive Operationsmethode, die einen Schritt in dem Algorithmus darstellt, soll nicht öffentlich sein, aber überwindbare (protected, in Java) und kann von zwei Arten sein: a) eine abstrakte Methode, die muss implementiert wird in der Unterklasse; b) ein Verfahren mit einem default / leer Implementierung, die können werden in der Unterklasse überschriebenen.

Ein gutes Beispiel in der Java 6 SDK ist die execute() Methode der javax.swing.SwingWorker Klasse (es ist eine public final void Methode). 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 ist durch die Template-Methode in einem Hintergrund-Thread genannt. Die anderen zwei haben leere Implementierungen und kann optional in der Unterklasse außer Kraft gesetzt werden; sie werden während und am Ende der Bearbeitung bzw. im EDT (der Swing-Event Dispatch Thread), genannt Aktualisierungen die Benutzeroberfläche zu ermöglichen.

In meiner eigenen Erfahrung, ich habe manchmal dieses Muster verwendet. Ein solcher Fall war eine Java-Basisklasse der Umsetzung der java.util.Iterator Schnittstelle, wo next() die Template-Methode war und es gab nur eine primitive Operation Methode für eine bestimmte Domain Entity-Klasse instanziieren (dies gemeint war, verwendet werden, wenn Iteration über eine Liste der persistenten Domain Entitätsobjekten, mit JDBC). Ein besseres Beispiel in der gleichen Anwendung war eine Basisklasse, wo die Template-Methode in einem mehrstufigen Algorithmus implementiert sollte eine „Wirtschaftseinheit Pflege“ (mit Swing) aus einer vorgegebenen Liste von persistenten Entitäten füllen; primitive Operationen Methoden 1 genannt wurden) Löschen des aktuellen Bildschirmzustand, und 2) innerhalb des Bildschirms eine Entität in einer Tabellenansicht hinzuzufügen; gegebenenfalls andere primitive Operationen aus der Vorlage Methode aufgerufen wurden, wenn der Bildschirm bearbeitet wird.

Am Ende muß ich sagen, dass, obwohl dies sicherlich ein nützliches Design-Muster ist, nicht so oft eine Situation aufkommt, wo es wirklich anwendbar ist. eine Basisklasse mit Methoden einfach aufweist, die in einer Unterklasse überschrieben bekommen (eine viel häufige Situation, in meiner Erfahrung) ist nicht genug, um mich selbst, als eine Anwendung des Musters zu qualifizieren.

Das Wichtigste in Template-Methode ist, dass Sie eine Reihe von abstrakten Methoden wie Schritte oder einem Algorithmus zu definieren und lassen Sie die Unterklasse Ersatz mit der konkreten Umsetzung für diese Methoden.

bewarb ich mich in einem der Dokument-Erzeugungsprogramm.

public abstract DocumentGenerator() 
{
   generateHeader();
   generateBody();
   generateDetails();
}
public HTMLDocGenerator : DocumentGenerator()
{
   public override generateBody()
   {
     //generate as in html format
   }
}

Sie können verschiedene Implementierung haben, wie PDF Generator csv-Generator und den Wert hier ist sie comform den Algorithmus. (Generieren -> Header, Body, Details)

A sollten Schablonenmuster verwendet werden, wenn es einen Algorithmus mit vielen Implementierungen ist. Der Algorithmus wird in einer Funktion in der Basisklasse definiert und die Umsetzung wird durch die Basisklasse und Unterklassen durchgeführt. Eine ausführliche Erklärung mit einem Echtzeit-Beispiel ist in http://preciselyconcise.com/design_patterns/templatemethod.php

Ich werde ein Beispiel aus der Praxis skizzieren, wo ich einige Template-Methoden verwendet werden.

In einer C ++ Computer-Vision-Algorithmus Anwendung wurde das Verhalten des Algorithmus entwickelt, um ein paar Aromen von Algorithmus Verhalten bei einigen Optionen basierend annehmen, zur Laufzeit lesen nach einem Enum in eine Konfigurationsdatei versteckt beim Start geladen. Das gesamte Skelett des Algorithmus war identisch mit Ausnahme einiger Schlüssel-Rückrufe in der Mitte ausgestopft, was sonst ein identischer Codeabschnitt sein würde, die nur brutal dupliziert würden verschiedene Funktionen auf dieser Ebene zu nennen. Diese Rückrufe ich verwenden wollte wurden in die Template-Methode der Basisklasse abstrahiert und die Template-Methode Muster alle, dass Code-Duplizierung verhindert. Die Enum wir grundsätzlich verwendet diktiert, was eine Unterklasse I Punkt meine Basisklasse Zeiger instanziiert und damit der Algorithmus den damit verbundenen wenig Geschmack im Verhalten verleihen.

Jetzt sind einige der Motive hinter dieser Vielfalt von Aromen des laufenden Algorithmus war ein Online-vs Offline-Funktionalität von Software, dass unser Gerät gesteuert. Der Offline-Geschmack mit ihm reichem debug / Diagnoseausgang gezogen und gehalten ein Koordinatensystem lokal auf einige Bildpixel, während der Online-Geschmack Dinge in einem absoluten gehalten Raumkoordinate und gepflegt Bedenken spezifisch für das laufende Gerät mit all seiner Robotik und was nicht. Ein weiterer Enum fuhr eine Auswahl unter einer Reihe von Klassifizierer wir für einige Maschine lernen, da auch verschiedene Klassifizierer unter verschiedenen Datensätzen ausgebildet wurden, die ansonsten identisch durch den Körper des Code floß aber interpretiert werden müsse anders basierend auf einige Regierungs Bedingungen dafür, wie dass Daten erstellt wurden.

Ich glaube, dass diese Art der Verwendung Fall, dass ich aus war entstanden, was die Loch in der Mitte Problem.

Ich habe die Template-Methode für Business-Logik verwendet, bei denen eine Anzahl von Komponenten den gleichen Prozess geteilt, aber die Umsetzung war etwas anders.

  

Die Template-Methode definiert die Skelettstruktur eines Algorithmus aber   aufschiebt bestimmte Schritte und Details zu Unterklassen. Die Struktur und die   Ablauf des Algorithmus statisch bleiben, aber die Details der Schritte sind   gestundet Subklassen.

verwendet I Template Method-Muster Dokumentinhalt vorzubereiten. Es gab viele verschiedene Arten von Dokumenten, dass jeder Typ seine eigene kleine Modifikationen aufweist. Allerdings war der Hauptprozess der Vorbereitung von Dokumenten für alle gleich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top