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 采集程序中常用的函数
Dec 09 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
May 02 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 PHP
PHP将字符分解为多个字符串的方法
Nov 22 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
CI框架集成Smarty的方法分析
May 17 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 PHP
thinkphp5使html5实现动态跳转的例子
Oct 16 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 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 xml实例 留言本
2009/03/20 PHP
PHP Socket 编程
2010/04/09 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
2014/09/25 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
Vue指令指令大全
2019/02/09 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
Python中的列表知识点汇总
2015/04/14 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
python操作oracle的完整教程分享
2018/01/30 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
商场消防管理制度
2014/01/12 职场文书
幼儿园毕业家长感言
2014/02/10 职场文书
党员创先争优活动总结
2014/05/04 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers