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 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
深入php数据采集的详解
Jun 02 PHP
php防止sql注入代码实例
Dec 18 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
php数组排序usort、uksort与sort函数用法
Nov 17 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
thinkphp实现附件上传功能
May 26 PHP
详解PHP发送邮件知识点
May 06 PHP
php微信公众号开发之音乐信息
Oct 20 PHP
Mac下关于PHP环境和扩展的安装详解
Oct 17 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项目的方法
2006/10/09 PHP
php动态生成JavaScript代码
2009/03/09 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
PHP 遍历文件实现代码
2011/05/04 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
js实现抽奖功能
2020/11/24 Javascript
为Python程序添加图形化界面的教程
2015/04/29 Python
python获取各操作系统硬件信息的方法
2015/06/03 Python
Python探索之修改Python搜索路径
2017/10/25 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Flask框架配置与调试操作示例
2018/07/23 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
python计算导数并绘图的实例
2020/02/29 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
银行领导班子四风对照检查材料
2014/09/27 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
中学团支部工作总结
2015/08/13 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
java版 简单三子棋游戏
2022/05/04 Java/Android
Oracle锁表解决方法的详细记录
2022/06/05 Oracle