(Credits: Blog von Vishal Chovatiya)
„Um einen Entwurf eines Algorithmus auf einer höheren Ebene bereitzustellen, der von seinen abgeleiteten Klassen zu vervollständigen ist.”
Definiert das prinzipielle Grundgerüst eines Algorithmus in einer zentralen Methode. Diese lagert einen oder vorzugsweise mehrere Teilschritte in Methoden abgeleiteter Klassen aus. Änderungen an den Teilschritten haben keine Auswirkungen auf die Arbeitsweise (Realisierung) der zentralen Methode.
Das Template Method Pattern ist ein Verhaltensentwurfsmuster, das das Grundgerüst eines Algorithmus in einer Oberklasse definiert, Unterklassen jedoch bestimmte Schritte des Algorithmus überschreiben lässt, ohne dabei seine prinzipielle Struktur zu ändern.
Es gibt eine Methode oder anders formuliert, eine Reihe von auszuführenden Schritten (Teilmethoden), die auf einer höheren Abstraktionsebene festgelegt sind (Reihenfolge der Ausführung, Bereitstellung von Parametern, ...).
In einer niedrigeren Abstraktionsebene (Detailebene) können die Teilmethoden eine unterschiedliche Implementierung haben.
Das Template Method Pattern hat zum Inhalt, dass Sie einen Algorithmus in eine Reihe von Schritten aufteilen, diese Schritte in Methoden umwandeln und diese Methoden in einer einzigen „Vorlagenmethode” aufrufen, daher auch der Name dieses Entwurfsmusters. Die Schritte können entweder abstrakt sein oder eine Standardimplementierung aufweisen. Um den Algorithmus zu verwenden, muss der Client eine eigene Unterklasse bereitstellen, alle abstrakten Schritte implementieren und bei Bedarf einige der optionalen Schritte überschreiben. Die Vorlagenmethode sollte dabei nicht überschrieben oder verändert werden!
Das Template Method Pattern ermöglicht die Realisierung von variierenden Teilschritten, während ein konsistenter Grundprozess beibehalten wird.
Abbildung 1: Schematische Darstellung des Template Method Patterns.
In Spezialisierungen der Oberklasse können bzw. sollten ein oder mehrere Teilmethoden überschrieben werden, um die Template Methode in der Oberklasse zu vervollständigen.
Die Skelett-Methode ist davon ausgenommen - die prinzipielle Struktur des Algorithmus ist beizubehalten, also nicht zu verändern.
Im „Real-World” Beispiel zu diesem Entwurfsmuster definiert die Template-Methode einen Algorithmus für die Arbeit mit einem sozialen Netzwerk. Unterklassen, die einem bestimmten sozialen Netzwerk entsprechen, implementieren diese Schritte gemäß der vom sozialen Netzwerk bereitgestellten API.
Die Klasse SocialNetwork repräsentiert die Basisklasse des sozialen Netzwerks.
Zwei weitere Klassen Twitter und Facebook stehen für konkrete Beispiele sozialer Netzwerke.
Die „Vorlagenmethode” ist in der Klasse SocialNetwork vorgegeben, sie lautet post:
bool post(const std::string& message);Ihre Implementierung darf nicht verändert werden, um dem Charakter des Entwurfsmusters gerecht zu werden.
Die Teilschritte, die zur Realisierung der post-Methode erforderlich sind, lauten in dem Beispiel
logIn, logOut und sendData. Diese drei Methoden sind geeignet von konkreten Social Media Klassen
zu überschreiben, siehe dazu auch Abbildung 2:
Abbildung 2: Das Template Method Pattern am Beispiel sozialer Netzwerke.
Die Anwendungsfälle des Template Method-Pattern und des Strategy-Pattern sind ziemlich ähnlich. Beide Muster ermöglichen es, Variationen eines Algorithmus bereitzustellen. Das Template Method-Pattern basiert auf der Ebene von Klassen und der Bildung von Unterklassen, das Strategiemuster auf der Ebene von Objekten und deren Komposition.
Das Strategy-Pattern erhält unterschiedliche Strategien in der Gestalt von Objekten und kann somit zur Laufzeit seine Strategien austauschen.
Die Template-Methode kehrt den Kontrollfluss nach dem Hollywood-Prinzip um: „Don't call us, we call you”.
Das Strategy-Pattern gleicht mehr einer Black Box. Es ermöglicht, eine Strategie durch eine andere zu ersetzen, ohne deren Details zu kennen.
Frage: Was ist der Unterschied zwischen dem Strategy- und Template Method-Pattern?
-
Das Template Method-Pattern basiert auf Vererbung: Es werden Teile eines Algorithmus verändert, indem diese Teile in abgeleiteten Klassen erweitert werden.
-
Strategy-Pattern basiert auf der Komposition: Es werden Teile des Verhaltens eines Objekts verändert, indem es verschiedene Strategien haben kann, die unterschiedlichem Verhalten entsprechen.
oder auch:
-
Template Method-Pattern: Funktioniert auf Klassenebene, es ist also ein statisches Konzept.
-
Strategy-Pattern: Funktioniert auf Objektebene, das Verhalten wird zur Laufzeit geändert.
Die Anregungen zum konzeptionellen Beispiel finden Sie unter
https://refactoring.guru/design-patterns
und
vor.
