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+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
详解php几行代码实现CSV格式文件输出
Jul 01 PHP
PHP 获取 ping 时间的实现方法
Sep 29 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
phpinfo的知识点总结
Oct 10 PHP
Laravel 读取 config 下的数据方法
Oct 13 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
Apr 07 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 一个页面执行时间类代码
2010/03/05 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
JS跨域问题详解
2014/11/25 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Django中使用Celery的教程详解
2018/08/24 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
带你认识Django
2019/01/15 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
韩语专业本科生求职信
2013/10/01 职场文书
采购部岗位职责
2013/11/24 职场文书
学校评语大全
2014/05/06 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
经费申请报告范文
2015/05/18 职场文书
安全教育片观后感
2015/06/17 职场文书