Schablonen-Muster
Beim Template-Muster definiert eine abstrakte Klasse öffentlich die Art/Schablone zur Ausführung ihrer Methoden. Ihre Unterklassen können Methodenimplementierungen nach Bedarf überschreiben, aber der Aufruf erfolgt auf die in der abstrakten Klasse definierte Weise. Diese Art von Entwurfsmuster ist ein Verhaltensmuster.
Einführung
Absicht
Das Skelett eines Algorithmus wird in der Elternklasse definiert, und Unterklassen dürfen bestimmte spezifische Schritte des Algorithmus neu definieren, ohne die Struktur des Algorithmus zu ändern.
Wesentliche gelöste Probleme
- Es löst das Problem, dieselben Methoden in mehreren Unterklassen wiederholt zu implementieren, indem gemeinsame Methoden in die Elternklasse abstrahiert werden, um Codeduplizierung zu vermeiden.
Anwendungsfall
- Wenn es gemeinsame Methoden gibt, die unter mehreren Unterklassen gemeinsam genutzt werden können.
Implementierungsansatz
- Definiere eine abstrakte Elternklasse: Enthält die Template-Methode und einige abstrakte oder konkrete Methoden.
- Konkrete Unterklasse: Erbt von der abstrakten Elternklasse und implementiert abstrakte Methoden, ohne die Algorithmusstruktur zu ändern.
Schlüsselcode
- Template Method: In der abstrakten Elternklasse definiert, ruft abstrakte Methoden und konkrete Methoden auf.
- Abstrakte Methode: Wird von Unterklassen implementiert und repräsentiert die variablen Teile des Algorithmus.
- Konkrete Methode: In der abstrakten Elternklasse implementiert und repräsentiert die invarianten Teile des Algorithmus.
Anwendungsbeispiel
- Bauprozess: Schritte wie Fundament, Verkabelung und Sanitärinstallation sind gleich, während spätere Bauschritte wie das Hinzufügen von Schränken und Zäunen unterschiedlich sind.
- Die 81 Prüfungen der Reise nach Westen: Die vom Bodhisattva festgelegten 81 Prüfungen repräsentieren ein logisches Gerüst auf oberster Ebene.
- Springs Unterstützung für Hibernate: Kapselt gängige Methoden wie das Öffnen einer Transaktion, das Abrufen einer Session und das Schließen einer Session.
Vorteile
- Die invarianten Teile kapseln: Der invariante Teil des Algorithmus wird in der Elternklasse gekapselt.
- Die variablen Teile erweitern: Unterklassen können die variablen Teile des Algorithmus erweitern oder ändern.
- Gemeinsamen Code extrahieren: Reduziert Code-Duplikation und erleichtert die Wartung.
Nachteile
- Zunahme der Klassenanzahl: Jede unterschiedliche Implementierung erfordert eine Unterklasse, was dazu führen kann, dass das System groß wird.
Verwendungshinweise
- Wenn mehrere Unterklassen gemeinsame Methoden mit identischer Logik haben, sollte die Verwendung des Template-Method-Musters in Betracht gezogen werden.
- Für wichtige oder komplexe Methoden können Sie erwägen, sie als Template-Methoden in der Elternklasse zu definieren.
Hinweise
- Um böswillige Änderungen zu verhindern, wird die Template-Methode üblicherweise als final deklariert.
finalSchlüsselwort-Modifikation, um ein Überschreiben durch Unterklassen zu vermeiden.
Die beteiligten Hauptrollen
-
Abstrakte Elternklasse (Abstract Class):
- Definiert die Template-Methode sowie einige abstrakte oder konkrete Methoden.
-
Konkrete Klassen:
- Erbt von der abstrakten Elternklasse und implementiert abstrakte Methoden.
-
Hook-Methode (optional):
- In der abstrakten Elternklasse definiert, kann von Unterklassen überschrieben werden, um das Verhalten der Template-Methode zu beeinflussen.
-
Client (optional):
- Abstrakte Elternklassen und konkrete Unterklassen verwenden, ohne sich um die Details der Template-Methode kümmern zu müssen.
Implementierung
Wir werden eine Klasse erstellen, die Operationen definiertGameabstrakte Klasse, bei der die Template-Methode als final festgelegt ist, sodass sie nicht überschrieben wird.CricketundFootballErweitertGameDie konkreten Klassen, die die Methoden der abstrakten Klasse überschreiben.
TemplatePatternDemo, und unsere Demonstrationsklasse verwendet esGame, um die Verwendung des Template-Musters zu demonstrieren.
Schritt 1
Erstellen Sie eine abstrakte Klasse, deren Template-Methode auf final gesetzt ist.
Game.java
Schritt 2
Erstellen Sie Entitätsklassen, die die obige Klasse erweitern.
Cricket.java
Football.java
Schritt 3
VerwendungGameVerwenden Sie die Template-Methode play(), um zu demonstrieren, wie das Spiel definiert ist.
TemplatePatternDemo.java
Schritt 4
Führen Sie das Programm aus und geben Sie die Ergebnisse aus:
Cricket Game Initialized! Start playing. Cricket Game Started. Enjoy the game! Cricket Game Finished! Football Game Initialized! Start playing. Football Game Started. Enjoy the game! Football Game Finished!Weitere Erweiterungen