PHP設(shè)計(jì)模式之模板方法模式Template Method Pattern詳解
目錄
- 簡(jiǎn)介
- 適用場(chǎng)景
- 優(yōu)點(diǎn)
- 缺點(diǎn)
- 其它
- 代碼
簡(jiǎn)介
模板方法模式,是行為型的設(shè)計(jì)模式。
定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類當(dāng)中,使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重新定義該算法的某些特定步驟。
通俗講,模板方法模式是偏向繼承的設(shè)計(jì)模式,當(dāng)子類有重復(fù)的動(dòng)作時(shí)候,可將他們提取出來,放在父類進(jìn)行處理。
適用場(chǎng)景
算法結(jié)構(gòu)相同但是算法不同的場(chǎng)景下使用,父類控制整體,子類具體實(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)
受到父類約束,繼承讓耦合度變大,某些場(chǎng)景下會(huì)有局限性。
其它
相比較與策略模式相似。
但是模板方法的定位是父類控制整體,子類具體實(shí)現(xiàn)。為了優(yōu)雅的擴(kuò)展代碼而生。
策略模式的定位是根據(jù)情況選定合適的算法。
代碼
//抽象出來一個(gè)下載類 abstract class DownloadSongs { protected $singer; protected $operator; public function __construct($singer) { $this->singer = $singer; } //前置鉤子 protected function beforeDownloadHook() { echo "充值" . $this->operator . "會(huì)員" . PHP_EOL; } //后置鉤子 protected function afterDownloadHook() { echo $this->operator . "還算好用,就是要充會(huì)員" . 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)父類的兩個(gè)方法 class KuGouMusic extends DownloadSongs { protected $operator = "酷狗"; protected function downloadMusic() { echo "從酷狗音樂上下載" . $this->singer . "的歌曲" . PHP_EOL; } } //QQ類,實(shí)現(xiàn)父類的兩個(gè)方法 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è)計(jì)模式之模板方法模式Template Method Pattern詳解的文章就介紹到這了,更多相關(guān)PHP模板方法模式內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!
