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

 更新时间:2022年12月20日 15:06:09   作者:程序员-南  
在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角——模板方法模式

简介

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

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

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

适用场景

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

优点

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

方便实现钩子函数。

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

符合开闭原则。

方便扩展。

缺点

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

其它

相比较与策略模式相似。

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

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

代码

//抽象出来一个下载类
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();

到此这篇关于PHP设计模式之模板方法模式Template Method Pattern详解的文章就介绍到这了,更多相关PHP模板方法模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP Laravel门面的实现原理详解

    PHP Laravel门面的实现原理详解

    在Laravel中,门面为应用服务容器中绑定的类提供了一个“静态”接口,使得我们可以不用new这些类出来,就可以直接通过静态接口调用这些类中的方法。本文就来详细聊聊Laravel门面的实现原理,希望对大家有所帮助
    2023-02-02
  • php实现与erlang的二进制通讯实例解析

    php实现与erlang的二进制通讯实例解析

    这篇文章主要介绍了php实现与erlang的二进制通讯实例解析,需要的朋友可以参考下
    2014-07-07
  • 一家之言的经验之谈php+mysql扎实个人基本功

    一家之言的经验之谈php+mysql扎实个人基本功

    在学习php的过程中,我们开始就需要注意的问题
    2008-03-03
  • PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结

    PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结

    这篇文章主要介绍了PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结,并给出了一个综合使用这些函数的例子做了一个简易文件浏览器,需要的朋友可以参考下
    2014-11-11
  • PHP实现LRU算法的示例代码

    PHP实现LRU算法的示例代码

    LRU是Least Recently Used 近期最少使用算法, 内存管理的一种页面置换算法。本文将详解LRU算法的原理以及实现,感兴趣的小伙伴可以学习一下
    2022-06-06
  • php画图实例

    php画图实例

    这篇文章主要介绍了php画图的方法,实例讲述了基于PHP绘制图像与文字的方法,需要的朋友可以参考下
    2014-11-11
  • 关于Zend Studio 配色方案插件的介绍

    关于Zend Studio 配色方案插件的介绍

    本篇文章是对Zend Studio 配色方案插件的使用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP优化之批量操作MySQL实例分析

    PHP优化之批量操作MySQL实例分析

    这篇文章主要介绍了PHP优化之批量操作MySQL,结合实例形式对比分析了PHP批量操作MySQL相关实现技巧与操作注意事项,需要的朋友可以参考下
    2020-04-04
  • php实现图片按比例截取的方法

    php实现图片按比例截取的方法

    这篇文章主要介绍了php实现图片按比例截取的方法,涉及php针对图形的读取、运算及生成相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • php新浪微博登录接口用法实例

    php新浪微博登录接口用法实例

    这篇文章主要介绍了php新浪微博登录接口用法,以实例形式分析了新浪微博接口的申请与具体使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12

最新评论