简介:
模板方法模式,是行为型的设计模式。
定义一个操作中的算法的骨架,而将一些步骤延迟到子类当中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
通俗讲,模板方法模式是偏向继承的设计模式,当子类有重复的动作时候,可将他们提取出来,放在父类进行处理。
适用场景:
算法结构相同但是算法不同的场景下使用,父类控制整体,子类具体实现。
优点:
- 体现了继承的优点,实例化子类,子类继承的是父类的模板方法,可以实现统一格式的算法调用,并避免重复。
- 方便实现钩子函数。
- 用户只需要实现子类的部分逻辑,实例化父类就可以完成功能。
- 符合开闭原则。
- 方便扩展。
缺点:
受到父类约束,继承让耦合度变大,某些场景下会有局限性。
其它:
相比较与策略模式相似。
但是模板方法的定位是父类控制整体,子类具体实现。为了优雅的扩展代码而生。
策略模式的定位是根据情况选定合适的算法。
代码
//抽象出来一个下载类
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();