簡介:
模板方法模式,是行為型的設計模式,
定義一個操作中的演算法的骨架,而將一些步驟延遲到子類當中,使得子類可以不改變一個演算法的結構即可重新定義該演算法的某些特定步驟,
通俗講,模板方法模式是偏向繼承的設計模式,當子類有重復的動作時候,可將他們提取出來,放在父類進行處理,
適用場景:
演算法結構相同但是演算法不同的場景下使用,父類控制整體,子類具體實作,
優點:
- 體現了繼承的優點,實體化子類,子類繼承的是父類的模板方法,可以實作統一格式的演算法呼叫,并避免重復,
- 方便實作鉤子函式,
- 用戶只需要實作子類的部分邏輯,實體化父類就可以完成功能,
- 符合開閉原則,
- 方便擴展,
缺點:
受到父類約束,繼承讓耦合度變大,某些場景下會有局限性,
其它:
相比較與策略模式相似,
但是模板方法的定位是父類控制整體,子類具體實作,為了優雅的擴展代碼而生,
策略模式的定位是根據情況選定合適的演算法,
代碼
//抽象出來一個下載類
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;
}
//組合呼叫
public function download() {
$this->beforeDownloadHook();
$this->downloadMusic();
$this->afterDownloadHook();
}
//具體實作讓子類進行
abstract protected function downloadMusic();
}
//酷狗類,實作父類的兩個方法
class KuGouMusic extends DownloadSongs {
protected $operator = '酷狗';
protected function downloadMusic() {
echo '從酷狗音樂上下載' . $this->singer . '的歌曲' . PHP_EOL;
}
}
//QQ類,實作父類的兩個方法
class QQMusic extends DownloadSongs {
protected $operator = 'QQ';
protected function downloadMusic() {
echo '從QQ音樂上下載' . $this->singer . '的歌曲' . PHP_EOL;
}
}
//呼叫端=======================================================================
(new KuGouMusic('鳳凰傳奇'))->download();
(new QQMusic('英文'))->download();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531454.html
標籤:其他
上一篇:RabbitMQ學習筆記
