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 购物车实例(申精)
May 11 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
怎样搭建PHP开发环境
Jul 28 PHP
浅谈php7的重大新特性
Oct 23 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
php微信开发之图片回复功能
Jun 14 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
PHP实现字符串大小写转函数的功能实例
Feb 06 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
jQuery 动画基础教程
2008/12/25 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
如何基于python操作json文件获取内容
2019/12/24 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
家长会学生家长演讲稿
2013/12/29 职场文书
中层竞聘演讲稿
2014/01/09 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
亲属关系公证书
2014/04/08 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
岗位安全生产责任书
2014/07/28 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
2014年护理部工作总结
2014/11/14 职场文书
综合素质自我评价评语
2015/03/06 职场文书
汽车销售合同文本
2019/08/08 职场文书