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
投稿

猜你喜欢

  • adox 的vbs类,提取表名,列名等

    2008-07-02 12:37:00
  • 分享SQL Server删除重复行的6个方法

    2011-09-30 11:33:05
  • asp日期转换成汉字格式程序

    2008-07-08 18:19:00
  • 用Dreamweaver设计自动关闭的网页

    2010-09-02 12:29:00
  • 不要忽略了颜色的可用性

    2009-03-05 18:19:00
  • sql server常用命令行操作(启动、停止、暂停)

    2012-01-05 19:02:48
  • 网页新窗口打开好不好,数据说话

    2008-05-31 17:01:00
  • Div即父容器不根据内容自适应高度的解决方法

    2010-04-23 18:19:00
  • IE8 的 JSON 解析 Bug

    2009-05-22 12:36:00
  • Mootools 1.2教程(12)——用Drag.Move实现拖拽和拖放

    2008-12-05 12:29:00
  • ASP项目中的asp分页 翻页模块函数

    2010-04-03 21:03:00
  • ASP利用Google实现在线翻译功能

    2010-03-07 17:28:00
  • MySQL也能并发导入数据

    2010-03-25 10:38:00
  • 表格可读性提升分析

    2010-05-19 13:03:00
  • 简单触发器的使用 献给SQL初学者

    2011-09-30 11:27:49
  • ASP(JScript)构建SQL语句“类”

    2008-04-30 07:12:00
  • asp textarea 多行数组分割处理方法

    2011-03-03 10:55:00
  • HTML 5 Video概述

    2010-06-23 18:56:00
  • RC4经典加密算法asp/VBs版本代码

    2008-02-17 17:32:00
  • SQLServer 存储过程简介与使用方法

    2009-07-07 14:06:00
  • asp之家 网络编程 m.aspxhome.com