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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
Oct 09 PHP
PHP 编程请选择正确的文本编辑软件
Dec 21 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
微信公众平台实现获取用户OpenID的方法
Apr 15 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
Apr 21 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
May 08 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
Feb 04 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
PHP根据key删除数组中指定的元素
Feb 28 PHP
解决laravel中日志权限莫名变成了root的问题
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 cookie的操作实现代码(登录)
2010/12/29 PHP
PHP二维数组的去重问题解析
2011/07/17 PHP
php全排列递归算法代码
2012/10/09 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
js简易版购物车功能
2017/06/17 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
laydate日历控件使用方法详解
2017/11/20 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
Python常用库推荐
2016/12/04 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
HTML5样式控制示例代码
2013/11/27 HTML / CSS
公司领导推荐信
2013/11/12 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
股东授权委托书范本
2014/09/13 职场文书
2014司机年终工作总结
2014/12/05 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
文明旅游倡议书
2015/04/28 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
Go web入门Go pongo2模板引擎
2022/05/20 Golang