Das Vorlagenmethodenmuster ist auch ein häufig verwendetes Entwurfsmuster, bei dem es sich um ein Verhaltensentwurfsmuster handelt. Seine Definition lautet: Definieren Sie das Grundgerüst eines Algorithmus in einer Methode und verschieben Sie einige Schritte auf Unterklassen. Mithilfe von Vorlagenmethoden können Unterklassen bestimmte Schritte im Algorithmus neu definieren, ohne die Struktur des Algorithmus zu ändern.
Szenario
Normalerweise stehe ich am Wochenende spät auf, also gehe ich nicht raus, um Frühstück zu kaufen, sondern mache vielleicht einfach einen Eimer Instantnudeln oder scharf-saure Nudeln oder Huainan-Rindfleischsuppe . Die Schritte zum Einweichen von Instantnudeln oder scharf-sauren Nudeln sind die gleichen. Zuerst müssen Sie kochendes Wasser zubereiten, dann die Instantnudeln oder scharf-sauren Nudeln in kochendem Wasser einweichen, dann Ihr eigenes Gewürzpaket hinzufügen und schließlich einweichen 2 bis 3 Minuten. Es gibt zwei Schritte, die genau gleich sind (kochendes Wasser vorbereiten, 2 bis 3 Minuten einweichen) und zwei Schritte, die ähnlich sind (Zutaten einweichen, entsprechende Gewürzpäckchen hinzufügen).
Für das obige Szenario können wir einen Algorithmus zum Einweichen von Instantnudeln oder scharf-sauren Nudeln definieren. Dieser Algorithmus ist sehr einfach, 4 Schritte
Kochendes Wasser vorbereiten
Zutaten einweichen (Instant-Nudeln oder scharf-saure Nudeln)
Gewürze hinzufügen (Instant-Nudeln und scharf-saure Nudeln haben ihre eigenen Gewürzbeutel)
2–3 Minuten in kochendem Wasser einweichen
Jetzt verwenden wir das Muster der Vorlagenmethode, um die oben genannten Anforderungen zu erfüllen.
Definieren Sie zunächst eine abstrakte Klasse, die den spezifischen Algorithmus und jeden Schritt definiert.
abstract class Breakfast { final public function prepare () { $this->boilWater(); $this->brew(); $this->addSeasoning(); $this->wait(); } public function boilWater () { echo '准备开水' . PHP_EOL; } // 泡食材 abstract public function brew (); // 加调料 abstract public function addSeasoning (); public function wait () { echo '等待2~3分钟' . PHP_EOL; } }
Die Prepare-Methode enthält den spezifischen Algorithmus. Durch Hinzufügen von final zu dieser Methode wird verhindert, dass die Methode überschrieben wird. Darüber hinaus können Sie sehen, dass es hier zwei abstrakte Methoden gibt, die von zukünftigen Generationen vervollständigt werden müssen.
Als nächstes vervollständigen wir die Kategorien Instantnudeln und scharf-saure Nudeln. Diese beiden Klassen müssen Breakfast erben und dann die abstrakte Methode abschließen.
class Noodle extends Breakfast { public function brew () { echo '加入方便面' . PHP_EOL; } public function addSeasoning () { echo '加入方便面的调料包' . PHP_EOL; } } class Powder extends Breakfast { public function brew () { echo '加入酸辣粉' . PHP_EOL; } public function addSeasoning () { echo '加入酸辣粉的调料包' . PHP_EOL; } }
Das obige Beispiel ist ein typisches Vorlagenmethodenmuster. Das Algorithmusgerüst wird in der übergeordneten Klasse definiert und die Unterklasse führt einige Schritte im Algorithmus aus.
Hooks
Das obige Beispiel spiegelt ein häufiges Szenario im Vorlagenmethodenmuster wider: Wiederverwendung. Neben der Wiederverwendung ist das Vorlagenmethodenmuster auch eine wichtige Anwendungserweiterung.
Das Template-Methodenmuster wird durch Hooks erweitert. Ein Hook ist eine in einer abstrakten Klasse deklarierte Methode, jedoch mit einer leeren oder Standardimplementierung. Das Vorhandensein von Hooks gibt Unterklassen die Möglichkeit, verschiedene Punkte des Algorithmus einzubinden. Es liegt an der Unterklasse, zu entscheiden, ob sie eingehängt wird oder nicht.
Lassen Sie uns weiterhin die Verwendung von Haken anhand von Beispielen erklären. Wenn ich Instantnudeln esse, füge ich normalerweise Schinken oder Eier hinzu. Das Hinzufügen von Schinken und Eiern ist ungewiss, daher können wir es einhaken und die Unterklasse entscheiden lassen, ob Schinken oder Eier hinzugefügt werden sollen.
Frühstück.php ändern
abstract class Breakfast { final public function prepare () { $this->boilWater(); $this->brew(); $this->addSeasoning(); $this->hook(); $this->wait(); } // 省略部分方法 // 默认不做任何事情 public function hook () :void {} }
Noodle.php ändern und die Hook-Methode neu schreiben
public function hook(): void { echo '加入火腿和鸡蛋' . PHP_EOL; }
Template-Methodenmuster und Callback-Funktion
Es gibt viele Funktionen in PHP, die ähnliche Ideen wie das Template-Methodenmuster oder die Template-Strategie verwenden Muster, wie zum Beispiel die Funktion sort(), die den Sortieralgorithmus kapselt, aber die spezifischen Sortierregeln werden durch die Rückruffunktion vervollständigt. Durch die Rückruffunktion müssen keine abstrakten Klassen und Unterklassen erstellt werden, wodurch die Codemenge erheblich reduziert wird.
Die Beziehung zwischen Template-Methodenmuster, Factory-Methodenmuster und Strategiemuster
Factory-Methodenmuster ist eine Sonderform des Template-Methodenmusters.
Die Vorlagenmethode basiert auf dem Vererbungsmechanismus: Sie ermöglicht es Ihnen, einen Teil des Algorithmus zu ändern, indem Sie einen Teil des Inhalts in der Unterklasse erweitern.
Das Strategiemuster basiert auf dem Kompositionsmechanismus: Sie können einen Teil des Verhaltens eines Objekts ändern, indem Sie unterschiedliche Strategien für das entsprechende Verhalten bereitstellen.
Vorlagenmethoden arbeiten auf Klassenebene, sind also statisch. Richtlinien wirken auf Objektebene und ermöglichen so die Änderung des Verhaltens zur Laufzeit.
Das obige ist der detaillierte Inhalt vonVerstehen Sie das Template-Methodenmuster von PHP-Entwurfsmustern in einem Artikel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!