模板模式 (Template Pattern): 定義一個操作中的算法的骨架捞魁,而將一些步驟延遲到子類中团滥。模板模式使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟绳泉。
(一)為什么需要模板模式
1,一次性實現(xiàn)一個算法的不變的部分浩习,并將可變的行為留給子類來實現(xiàn)汽煮。
2, 多個子類有相同的方法睡毒,邏輯基本相同時来惧。可將相同的邏輯代碼提取到父類
3演顾,重構(gòu)時供搀,將相同代碼抽取到父類,然后通過鉤子函數(shù)約束其行為
(二)模板模式 UML圖
(三)簡單實例
這里舉《PHP設(shè)計模式》的一個例子:一個銀行可以有許多不同類型的銀行賬戶钠至,但是所有賬戶的處理方式基本相同葛虐。假設(shè)我們現(xiàn)在有兩類賬戶,一類是普通賬戶棉钧,一類是信用卡賬戶∮炱辏現(xiàn)在進行支付,信用卡允許透支宪卿,普通賬戶不允許透支摄悯,即賬戶金額不允許小于零
<?php
//抽象模板類
abstract class Template{
protected $balance = 100; //賬戶余額,為測試方便,直接賦初值100
//結(jié)算方法
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)次绘。這就可以把一個操作延遲綁定到子類上瘪阁。還有另一種應(yīng)用是把復(fù)雜的核心代碼設(shè)計為模板方法,周邊的相關(guān)細節(jié)則由子類實現(xiàn)邮偎。