PHP设计模式之模板方法模式Template Method Pattern详解

作者:程序员-南 时间:2023-05-25 00:24:26 

简介

模板方法模式,是行为型的设计模式。

定义一个操作中的算法的骨架,而将一些步骤延迟到子类当中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

通俗讲,模板方法模式是偏向继承的设计模式,当子类有重复的动作时候,可将他们提取出来,放在父类进行处理。

适用场景

算法结构相同但是算法不同的场景下使用,父类控制整体,子类具体实现。

优点

体现了继承的优点,实例化子类,子类继承的是父类的模板方法,可以实现统一格式的算法调用,并避免重复。

方便实现钩子函数。

用户只需要实现子类的部分逻辑,实例化父类就可以完成功能。

符合开闭原则。

方便扩展。

缺点

受到父类约束,继承让耦合度变大,某些场景下会有局限性。

其它

相比较与策略模式相似。

但是模板方法的定位是父类控制整体,子类具体实现。为了优雅的扩展代码而生。

策略模式的定位是根据情况选定合适的算法。

代码

//抽象出来一个下载类
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://blog.csdn.net/qq_42342282/article/details/127920585

标签:PHP,设计模式,模板方法模式
0
投稿

猜你喜欢

  • 验证javascript中Object和Function的关系的三段简单代码

    2024-04-29 13:43:32
  • ASP:一个网站空间多个域名访问

    2008-11-21 17:03:00
  • python+django+sql学生信息管理后台开发

    2021-10-09 11:20:26
  • Go语言反射reflect.Value实现方法的调用

    2023-07-22 15:50:11
  • PHP一些常用的正则表达式字符的一些转换

    2024-05-13 09:22:19
  • python高效过滤出文件夹下指定文件名结尾的文件实例

    2023-08-03 13:55:13
  • python 实现单通道转3通道

    2021-09-12 22:03:25
  • 一个20行左右的强$代码

    2009-12-25 15:22:00
  • 用python实现读取xlsx表格操作

    2022-11-26 17:08:19
  • Python去掉字符串中空格的方法

    2021-12-09 14:23:07
  • Go整合captcha实现验证码功能

    2024-04-26 17:29:43
  • Python开源自动化工具Playwright安装及介绍使用

    2023-08-20 13:17:43
  • Flask中基于Token的身份认证的实现

    2022-11-20 06:45:53
  • Python定义一个函数的方法

    2023-09-18 17:28:09
  • Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)

    2022-08-25 05:19:38
  • python字典的遍历3种方法详解

    2022-05-01 06:00:44
  • 用CSS实现柱状图(Bar Graph)的方法(二)—基于表格元素的柱状图

    2008-05-26 13:23:00
  • python操作toml文件的示例代码

    2023-06-12 03:58:33
  • JS遮罩层效果 兼容ie firefox jQuery遮罩层

    2024-02-24 23:04:24
  • ORACLE 分区表的设计

    2009-08-15 10:56:00
  • asp之家 网络编程 m.aspxhome.com