PHP设计模式之模板方法模式实例浅析


Posted in PHP onDecember 20, 2018

本文实例讲述了PHP设计模式之模板方法模式。分享给大家供大家参考,具体如下:

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

模板方法模式中会用到抽象模板,它的方法分为两类:

  • 基本方法,也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
  • 模板方法,可以有一个或多个,一般是一个具体方法,也就是一个框架,实现基本方法的调度,完成固定逻辑。

注意: 为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。

注意: 抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。

模板方法模式的优点

  • 封装不变部分,扩展可变部分。
  • 提取公共部分代码,便于维护。
  • 行为由父类控制,子类实现

示例:

<?php
/**
 * 模型方法模式
 */
abstract class ACar {
  abstract protected function start();
  abstract protected function engineBoom();
  abstract protected function alarm();
  abstract protected function stop();
  public function run() {
    $this->start();
    $this->engineBoom();
    $this->alarm();
    $this->stop();
  }
}
final class Benz extends ACar {
  protected function start() {
    echo 'Benz start' . PHP_EOL;
  }
  protected function engineBoom() {
    echo 'Benz engine boom' . PHP_EOL;
  }
  protected function alarm() {
    echo 'Benz alarm' . PHP_EOL;
  }
  protected function stop() {
    echo 'Benz stop' . PHP_EOL;
  }
}
final class BMW extends ACar {
  protected function start() {
    echo 'BMW start' . PHP_EOL;
  }
  protected function engineBoom() {
    echo 'BMW engine boom' . PHP_EOL;
  }
  protected function alarm() {
    echo 'BMW alarm' . PHP_EOL;
  }
  protected function stop() {
    echo 'BMW stop' . PHP_EOL;
  }
  // 修改顺序
  public function run() {
    $this->start();
    $this->alarm();
    $this->engineBoom();
    $this->stop();
  }
}
class Client {
  public static function run() {
    $benz = new Benz();
    $benz->run();
    $bmw = new BMW();
    $bmw->run();
  }
}
Client::run();

运行结果:

Benz start Benz engine boom Benz alarm Benz stop BMW start BMW alarm BMW engine boom BMW stop

注:部分内容摘自《设计模式之禅

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中实现汉字转区位码应用源码实例解析
Jun 14 PHP
浅谈php serialize()与unserialize()的用法
Jun 05 PHP
php删除数组元素示例分享
Feb 17 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
Codeigniter的dom类用法实例
Jun 26 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
Sep 11 PHP
php使用自定义函数实现汉字分割替换功能示例
Jan 30 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
php字符串过滤strip_tags()函数用法实例分析
Jun 24 PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 #PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 #PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 #PHP
PHP自定义错误处理的方法分析
Dec 19 #PHP
PHP异常类及异常处理操作实例详解
Dec 19 #PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
Dec 18 #PHP
PHP时间戳和日期相互转换操作实例小结
Dec 18 #PHP
You might like
PHP 观察者模式的实现代码
2013/05/10 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
Python 随机生成中文验证码的实例代码
2013/03/20 Python
Python代理抓取并验证使用多线程实现
2013/05/03 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
全面了解Python环境配置及项目建立
2016/06/30 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
pandas的resample重采样的使用
2020/04/24 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
参加招聘会后的感想
2015/08/10 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
MySQL常见优化方案汇总
2022/01/18 MySQL
MYSQL常用函数介绍
2022/05/05 MySQL