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 相关文章推荐
其他功能
Oct 09 PHP
PHP EOT定界符的使用详解
Sep 30 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
Apr 17 PHP
php中计算程序运行时间的类代码
Nov 03 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
Mar 04 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
PHP中Closure类的使用方法及详解
Oct 09 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
PDO::rollBack讲解
Jan 29 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
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
小程序实现投票进度条
2019/11/20 Javascript
vue+vant实现购物车全选和反选功能
2020/11/17 Vue.js
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python如何判断数独是否合法
2016/09/08 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
Django model反向关联名称的方法
2018/12/15 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
Python可迭代对象操作示例
2019/05/07 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
七夕情人节促销方案
2014/06/07 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
开业典礼致辞
2015/07/29 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js