PHP設計模式(十三)—模板模式 (Template Pattern)

模板模式 (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)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容