PHP設(shè)計模式之模板方法模式Template Method Pattern詳解
簡介
模板方法模式,是行為型的設(shè)計模式。
定義一個操作中的算法的骨架,而將一些步驟延遲到子類當(dāng)中,使得子類可以不改變一個算法的結(jié)構(gòu)即可重新定義該算法的某些特定步驟。
通俗講,模板方法模式是偏向繼承的設(shè)計模式,當(dāng)子類有重復(fù)的動作時候,可將他們提取出來,放在父類進(jìn)行處理。
適用場景
算法結(jié)構(gòu)相同但是算法不同的場景下使用,父類控制整體,子類具體實(shí)現(xiàn)。
優(yōu)點(diǎn)
體現(xiàn)了繼承的優(yōu)點(diǎn),實(shí)例化子類,子類繼承的是父類的模板方法,可以實(shí)現(xiàn)統(tǒng)一格式的算法調(diào)用,并避免重復(fù)。
方便實(shí)現(xiàn)鉤子函數(shù)。
用戶只需要實(shí)現(xiàn)子類的部分邏輯,實(shí)例化父類就可以完成功能。
符合開閉原則。
方便擴(kuò)展。
缺點(diǎn)
受到父類約束,繼承讓耦合度變大,某些場景下會有局限性。
其它
相比較與策略模式相似。
但是模板方法的定位是父類控制整體,子類具體實(shí)現(xiàn)。為了優(yōu)雅的擴(kuò)展代碼而生。
策略模式的定位是根據(jù)情況選定合適的算法。
代碼
//抽象出來一個下載類
abstract class DownloadSongs {
protected $singer;
protected $operator;
public function __construct($singer) {
$this->singer = $singer;
}
//前置鉤子
protected function beforeDownloadHook() {
echo '充值' . $this->operator . '會員' . PHP_EOL;
}
//后置鉤子
protected function afterDownloadHook() {
echo $this->operator . '還算好用,就是要充會員' . PHP_EOL;
}
//組合調(diào)用
public function download() {
$this->beforeDownloadHook();
$this->downloadMusic();
$this->afterDownloadHook();
}
//具體實(shí)現(xiàn)讓子類進(jìn)行
abstract protected function downloadMusic();
}
//酷狗類,實(shí)現(xiàn)父類的兩個方法
class KuGouMusic extends DownloadSongs {
protected $operator = '酷狗';
protected function downloadMusic() {
echo '從酷狗音樂上下載' . $this->singer . '的歌曲' . PHP_EOL;
}
}
//QQ類,實(shí)現(xiàn)父類的兩個方法
class QQMusic extends DownloadSongs {
protected $operator = 'QQ';
protected function downloadMusic() {
echo '從QQ音樂上下載' . $this->singer . '的歌曲' . PHP_EOL;
}
}
//調(diào)用端=======================================================================
(new KuGouMusic('鳳凰傳奇'))->download();
(new QQMusic('英文'))->download();到此這篇關(guān)于PHP設(shè)計模式之模板方法模式Template Method Pattern詳解的文章就介紹到這了,更多相關(guān)PHP模板方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
thinkphp使用phpmailer發(fā)送郵件的方法
這篇文章主要介紹了thinkphp使用phpmailer發(fā)送郵件的方法,包含了配置發(fā)送郵件類、設(shè)置參數(shù)及發(fā)送郵件測試等的具體步驟,具有一定的實(shí)用價值,需要的朋友可以參考下2014-11-11
php連接Access數(shù)據(jù)庫錯誤及解決方法
前二天把一個asp+access的網(wǎng)站改成php+access的,在連連數(shù)據(jù)庫時可真讓我狠狠的郁悶了一把,通過百度了大量的相關(guān)文章終于解決了2013-06-06
php提供實(shí)現(xiàn)反射的方法和實(shí)例代碼
在本篇文章里我們給各位分享了一篇關(guān)于php提供實(shí)現(xiàn)反射的方法和實(shí)例代碼相關(guān)內(nèi)容,有興趣的朋友們參考下。2019-09-09
PHP基于php_imagick_st-Q8.dll實(shí)現(xiàn)JPG合成GIF圖片的方法
這篇文章主要介紹了PHP基于php_imagick_st-Q8.dll實(shí)現(xiàn)JPG合成GIF圖片的方法,需要的朋友可以參考下2014-07-07
PHP中查詢SQL Server或Sybase時TEXT字段被截斷的解決方法
在CSDN的PHP版里老是看到有人問TEXT字段被截斷的問題,偶也回答了無數(shù)次,今天索性就總結(jié)一下吧2009-03-03
php模擬服務(wù)器實(shí)現(xiàn)autoindex效果的方法
這篇文章主要介紹了php模擬服務(wù)器實(shí)現(xiàn)autoindex效果的方法,實(shí)例分析了php操作URL及傳遞參數(shù)的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03

