模板模式 (Template Pattern): 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板模式使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
(一)為什么需要模板模式
1,一次性實現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實現(xiàn)。
2, 多個子類有相同的方法,邏輯基本相同時??蓪⑾嗤倪壿嫶a提取到父類
3,重構時,將相同代碼抽取到父類,然后通過鉤子函數(shù)約束其行為
(二)模板模式 UML圖

Template Pattern
(三)簡單實例
這里舉《PHP設計模式》的一個例子:一個銀行可以有許多不同類型的銀行賬戶,但是所有賬戶的處理方式基本相同。假設我們現(xiàn)在有兩類賬戶,一類是普通賬戶,一類是信用卡賬戶?,F(xiàn)在進行支付,信用卡允許透支,普通賬戶不允許透支,即賬戶金額不允許小于零
<?php
//抽象模板類
abstract class Template{
protected $balance = 100; //賬戶余額,為測試方便,直接賦初值100
//結算方法
abstract protected function adjust($num);
//支付信息顯示
abstract protected function display($num);
final public function apply($num){
$this->adjust($num);
$this->display($num);
}
}
//普通賬戶
class Account extends Template{
protected $falg; //用于判斷支付是否成功
protected function adjust($num){
if($this->balance > $num){//只有余額大于所需支付金額才允許支付
$this->balance-=$num;
$this->falg = true;
}else{
$this->falg = false;
}
}
protected function display($num){
if($this->falg){
echo '支付成功,所剩余額為'.$this->balance.PHP_EOL;
}else{
echo '余額不足,支付失敗,所剩余額為'.$this->balance.PHP_EOL;
}
}
}
//信用卡用戶
class Credit extends Template{
protected function adjust($num){
$this->balance-=$num;
}
protected function display($num){
echo '感謝您使用信用支付,所剩余額為'.$this->balance.PHP_EOL;
}
}
//普通賬戶使用
$account = new Account;
//普通賬戶使用
$account -> apply(80);
//普通賬戶透支
$account -> apply(30);
//信用卡賬戶使用
$credit = new Credit;
$credit -> apply(200);
模板模式的好處在于行為由父類控制,而具體的實現(xiàn)由子類實現(xiàn)。這就可以把一個操作延遲綁定到子類上。還有另一種應用是把復雜的核心代碼設計為模板方法,周邊的相關細節(jié)則由子類實現(xiàn)。