Vorlagenmethodenmuster ist ein Verhaltensmuster, das das Grundgerüst eines Algorithmus in einer Operation definiert und einige Schritte auf Unterklassen verschiebt. Mit der Vorlagenmethode können Unterklassen bestimmte Schritte eines Algorithmus neu definieren, ohne die Struktur des Algorithmus zu ändern.
Hauptrolle
Abstrakte Vorlage (AbstractClass)-Rolle
Definieren Sie eine oder mehrere abstrakte Methoden, die von Unterklassen implementiert werden sollen. Diese abstrakten Methoden werden als Grundoperationen bezeichnet und sind Komponenten der Logik der obersten Ebene.
Definieren Sie eine Vorlagenmethode. Bei dieser Vorlagenmethode handelt es sich im Allgemeinen um eine konkrete Methode, die das Grundgerüst der Logik der obersten Ebene angibt. Die logischen Kompositionsschritte befinden sich in den entsprechenden abstrakten Operationen, und diese Operationen werden auf Unterklassen verschoben. Gleichzeitig kann die Logik der obersten Ebene auch bestimmte Implementierungsmethoden
Konkrete Vorlage (ConcrteClass)-Rolle
aufrufen, um eine oder mehrere abstrakte Methoden der übergeordneten Klasse zu implementieren, die als vorhanden sind Bestandteil der obersten Logik.
Jeder abstrakten Vorlage können mehrere konkrete Vorlagen entsprechen, und jede konkrete Vorlage verfügt über eine eigene Implementierung der abstrakten Methode (d. h. eine Komponente der Logik der obersten Ebene), sodass die Implementierung der Die Logik der obersten Ebene ist anders.
Anwendbarkeit
Implementieren Sie die unveränderlichen Teile eines Algorithmus einmal und überlassen Sie das variable Verhalten Unterklassen.
Gemeinsame Verhaltensweisen in jeder Unterklasse sollten extrahiert und in einer gemeinsamen übergeordneten Klasse konzentriert werden, um Codeduplizierung zu vermeiden.
Unterklassenerweiterung steuern.
Klassendiagramm
Instanz
<?php abstract class AbstractClass { // 抽象模板角色 public function templateMethod() { // 模板方法 调用基本方法组装顶层逻辑 $this->primitiveOperation1(); $this->primitiveOperation2(); } abstract protected function primitiveOperation1(); // 基本方法 abstract protected function primitiveOperation2(); } class ConcreteClass extends AbstractClass { // 具体模板角色 protected function primitiveOperation1() {} protected function primitiveOperation2(){} } $class = new ConcreteClass(); $class->templateMethod(); ?>