Das Vorlagenmethodenmuster des Java-Entwurfsmusters definiert den Rahmen eines Betriebsalgorithmus und verschiebt einige Schritte auf Unterklassen, sodass Unterklassen bestimmte spezifische Schritte im Algorithmus neu definieren können, ohne die Struktur des Algorithmus zu ändern. Verhaltensmodell
Wie unten gezeigt:
Tatsächlich ist die Vorlagenmethode ein häufig verwendetes Muster in der Programmierung. Schauen wir uns zunächst ein Beispiel an. Eines Tages bekam Programmierer A die Aufgabe, bei einem gegebenen Array von ganzen Zahlen die Zahlen im Array von klein nach groß zu sortieren und dann die sortierten Ergebnisse auszudrucken. Nach der Analyse lässt sich diese Aufgabe grob in zwei Teile unterteilen: Sortieren und Drucken. Die Druckfunktion ist einfach zu implementieren, das Sortieren ist jedoch etwas mühsam. Aber A hat eine Möglichkeit, zuerst die Druckfunktion abzuschließen und dann jemand anderen zu finden, der die Sortierfunktion übernimmt.
abstract class AbstractSort { /** * Sortieren Sie das Array array von klein nach groß * @param array */ protected abstract void sort(int[] array) public void showSortResult(int[] array){ this.sort(array); System.out.print("Sortierungsergebnis: "); for (int i = 0; i < array.length; i++){ System.out.printf("%3s", array[i]);
Nachdem er mit dem Schreiben fertig war, fand A seinen Kollegen B, der gerade seinen Abschluss gemacht hatte, und sagte: „Ich habe die Hauptlogik bereits geschrieben. Sie können den Rest der Logik implementieren.“ Also gab ich B die AbstractSort-Klasse und bat B, die Implementierung zu schreiben. B hat es übernommen und einen Blick darauf geworfen. Es war zu einfach. Es konnte in 10 Minuten erledigt werden.
class ConcreteSort erweitert AbstractSort { @Override protected void sort(int[] array){ for(int i=0; i<array.length-1; i++){ selectSort(array, i) } private void selectSort(int[); ] array, int index) { int MinValue = 32767; // Minimalwertvariable int indexMin = 0; // Temporäre Speichervariable für (int i = index; i < array.length; i++) { if (array[i] < MinValue){ // Minimalwert ermitteln = array[i] } Temp = array[ index] ; // Zwei Werte austauschen array[index] = array[indexMin];
Geben Sie es nach dem Schreiben an A weiter, und A führt es aus:
public class Client { public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // Standarddatenarray public static void main(String[] args){ AbstractSort s = new ConcreteSort(); s.showSortResult(a);
Laufergebnisse:
Sortierergebnisse: 0 1 3 4 5 7 9 10 12 32
Es funktioniert gut. Okay, Mission erfüllt. Ja, das ist das Muster der Vorlagenmethode. Die meisten Absolventen, die gerade erst ins Berufsleben eingetreten sind, sollten eine ähnliche Erfahrung machen wie B. Für eine komplexe Aufgabe schreiben die besten Leute im Unternehmen die Hauptlogik, schreiben dann die scheinbar einfachen Methoden in abstrakte Methoden und überlassen die Entwicklung anderen Kollegen. Diese Arbeitsteilung wird häufig in Unternehmen mit einem offensichtlichen Umfang an Programmierpersonal angewendet. Wenn ein Projektteam beispielsweise aus einem Architekten, einem leitenden Ingenieur und einem Junioringenieur besteht, verwendet der Architekt im Allgemeinen eine große Anzahl von Schnittstellen und abstrakten Klassen, um die Logik des gesamten Systems aneinanderzureihen, und die Implementierungscodierung wird an ihn übergeben Der leitende Ingenieur bzw. der Junior-Ingenieur erledigen dies entsprechend der Schwierigkeit. Wie wäre es damit, haben Sie jemals das Muster der Vorlagenmethode verwendet?
Die Struktur des Vorlagenmethodenmusters:
Das Vorlagenmethodenmuster besteht aus einer abstrakten Klasse und einer (oder mehreren) Implementierungsklassen über eine Vererbungsstruktur. Die Methoden in der abstrakten Klasse sind in drei Typen unterteilt:
1. Abstrakte Methode : Sie wird nur in der übergeordneten Klasse deklariert, aber nicht implementiert. Stattdessen wird die Spezifikation definiert und dann von ihren Unterklassen implementiert.
2. Vorlagenmethode : von einer abstrakten Klasse deklariert und implementiert. Im Allgemeinen rufen Vorlagenmethoden abstrakte Methoden auf, um die wichtigsten logischen Funktionen abzuschließen. Die meisten Vorlagenmethoden sind als endgültige Typen definiert, was darauf hinweist, dass die wichtigsten logischen Funktionen in Unterklassen nicht überschrieben werden können.
3. Hook-Methode : Von der abstrakten Klasse deklariert und implementiert. Unterklassen können jedoch erweitert werden, und Unterklassen können die Logik von Vorlagenmethoden durch Erweitern von Hook-Methoden beeinflussen.
Die Aufgabe abstrakter Klassen besteht darin, einen logischen Rahmen aufzubauen, der normalerweise von erfahrenem Personal geschrieben wird, da die Qualität abstrakter Klassen direkt die Stabilität des Programms bestimmt.
Implementierungsklassen werden zur Implementierung von Details verwendet. Die Vorlagenmethode in der abstrakten Klasse vervollständigt die Geschäftslogik, indem sie die Methode der Klassenerweiterung implementiert. Solange die Erweiterungsmethode in der Implementierungsklasse den Komponententest besteht und die Vorlagenmethode korrekt ist, treten im Allgemeinen keine größeren Fehler in der Gesamtfunktion auf.
Vorteile und anwendbare Szenarien der Vorlagenmethode:
Einfach zu erweitern. Im Allgemeinen ist die Vorlagenmethode in einer abstrakten Klasse der Teil, der im Nachhinein nicht einfach geändert werden kann, während die abstrakte Methode der Teil ist, der im Nachhinein leicht geändert werden kann. Daher ist es im Allgemeinen einfach, die Funktion durch Hinzufügen von Implementierungsklassen zu erweitern , was dem Öffnungs- und Schließprinzip entspricht.
Leicht zu pflegen. Für das Vorlagenmethodenmuster wird die Vorlagenmethode gerade deshalb verwendet, weil ihre Hauptlogik dieselbe ist. Wenn die Vorlagenmethode nicht verwendet wird, kann derselbe Code auf verschiedene Klassen verteilt werden, was sehr umständlich zu verwalten ist. .
Flexibler. Aufgrund der Hook-Methode kann die Implementierung der Unterklasse auch die Funktionsweise der Hauptlogik in der übergeordneten Klasse beeinflussen. Obwohl die Unterklasse flexibel ist und Auswirkungen auf die übergeordnete Klasse hat, verstößt sie gegen das Liskov-Substitutionsprinzip und birgt auch Risiken für das Programm. Dies stellt höhere Anforderungen an die Gestaltung abstrakter Klassen.
Wenn mehrere Unterklassen dieselbe Methode haben und die Logik dieser Methoden dieselbe ist, können Sie die Verwendung des Vorlagenmethodenmusters in Betracht ziehen. Dieser Modus eignet sich auch besser für Situationen, in denen der Hauptrahmen des Programms derselbe ist, die Details jedoch unterschiedlich sind.