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学习之PHP运算符
Oct 09 PHP
PHP学习之数组值的操作
Apr 17 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
php的$_FILES的临时储存文件与回收机制实测过程
Jul 12 PHP
让PHP显示Facebook的粉丝数量方法
Jan 08 PHP
PHP中加密解密函数与DES加密解密实例
Oct 17 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 PHP
php实现的http请求封装示例
Nov 08 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 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绘制一条直线的方法
2015/01/24 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
布同 统计英文单词的个数的python代码
2011/03/13 Python
python实现的各种排序算法代码
2013/03/04 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
美德好少年事迹材料
2014/01/19 职场文书
商业房地产广告语
2014/03/13 职场文书
请假条怎么写
2014/04/10 职场文书
建房协议书
2014/04/11 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
合作与交流自我评价
2015/03/09 职场文书
请病假条范文
2015/08/17 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书