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 相关文章推荐
WINDOWS服务器安装多套PHP的另类解决方案
Oct 09 PHP
Search File Contents PHP 搜索目录文本内容的代码
Feb 21 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
PHP图片裁剪函数(保持图像不变形)
May 04 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
May 10 PHP
php获取发送给用户的header信息的方法
Mar 16 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
php格式化电话号码的方法
Apr 24 PHP
php将远程图片保存到本地服务器的实现代码
Aug 03 PHP
Laravel下生成验证码的类
Nov 15 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
PHP使用OB缓存实现静态化功能示例
Mar 23 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导出中文内容excel文件类实例
2015/07/06 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
JS版网站风格切换实例代码
2008/10/06 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
js实现打字小游戏
2019/12/17 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
最新茶叶店创业计划书
2014/01/14 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
放飞理想演讲稿
2014/09/09 职场文书
Vue图片裁剪组件实例代码
2021/07/02 Vue.js