Template Method(模板方法模式) 將具體處理交給子類 Template Method 就是定義一個操作中的演算法骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構可以定義該演算法的某些特定步驟 。 簡單地說就是 用一些抽象的操作定義一個演算法,而子類將重定義這些操作以提供具體的 ...
Template Method 就是定義一個操作中的演算法骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構可以定義該演算法的某些特定步驟 。
簡單地說就是 用一些抽象的操作定義一個演算法,而子類將重定義這些操作以提供具體的行為。
應用場景
-
一次性實現一個演算法的不變的部分,並將可變的行為留給子類來實現。
-
各子類中公共的行為應被提取出來並集中到一個公共父類中以避免代碼重覆。
-
控制子類擴展。在父類的模板方法中調用鉤子操作,子類可以重定義鉤子操作。簡單地說就是在父類的模板方法中調用預設方法,子類可以重定義這些預設方法。
鉤子操作(hook operation):它提供了預設的行為,子類可以在必要時進行擴展。一個鉤子操作在預設操作通常是一個空操作。
很重要的一點是模板對象應該指明哪些操作是鉤子操作(可以被重定義)以及哪些是抽象操作(必須被重定義)。要幼小的重用一個抽象類,子類編寫者必須明確瞭解哪些操作是設計為有待重定義的。
模式參與者
-
AbstractClass 抽象類
-
定義抽象的原語操作(primitive operation),具體的子類將從定義它們以實現一個演算法的各步驟。
-
實現一個模板方法,定義一個演算法的骨架,該模板方法不僅調用原語操作,也調用定義在AbstractClass或者其他對象中的操作。
-
-
ConcreteClass 具體類
-
實現原語操作以完成演算法中與特定子類相關的步驟。
-
-
ConcreteClass 靠 AbstractClass 來實現演算法中不變的步驟。
代碼示例
<?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(); ?>
拓展思路
-
可以使邏輯思路處理通用化
Template Method 優點在於在父類中編寫了公共演算法,因此無需在每個子類中在編寫演算法。
-
在Template Method模式中,父類和子類是緊密聯繫、共同工作的。因此,在子類中實現父類中申明的抽象方法時,必須要理解這些抽象方法被調用的時機。在看不到父類源代碼的情況下,想要編寫子類是非常困難的。
相關模式
-
Factory Method 模式
Factory Method 模式是將 Template Method 模式用於生成實例的一個典型例子。
-
Strategy 模式
在 Template Method 模式中,可以使用繼承改變程式的行為。這是因為 Template Method 模式在父類中定義程式行為的框架,在子類中決定具體的處理。
與此相對的是 Strategy 模式,它可以使用委托改變程式的行為。與 Template Method 模式中改變部分程式行為不同的是,Strategy 模式用於替換整個演算法。