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 和 COM
Oct 09 PHP
php mysql数据库操作分页类
Jun 04 PHP
php产生随机数的两种方法实例代码 输出随机IP
Apr 08 PHP
php 函数中使用static的说明
Jun 01 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
PHP实现的带超时功能get_headers函数
Feb 10 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
Feb 26 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 PHP
安装docker和docker-compose实例详解
Jul 30 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实现过滤UBB代码的类
2015/03/12 PHP
Using the TextRange Object
2006/10/14 Javascript
html中table数据排序的js代码
2011/08/09 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
python自动化脚本安装指定版本python环境详解
2017/09/14 Python
python @property的用法及含义全面解析
2018/02/01 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
Flask-WTF表单的使用方法
2019/07/12 Python
Python图片的横坐标汉字实例
2019/12/04 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
简单html5代码获取地理位置
2014/03/31 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
德国足球商店:OUTFITTER
2019/05/06 全球购物
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
结婚典礼证婚词
2014/01/11 职场文书
食品工程专业求职信
2014/06/15 职场文书
中文专业自荐书
2014/06/29 职场文书
自主招生英文自荐信
2015/03/25 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
离婚起诉书范本
2015/05/18 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
pytorch实现手写数字图片识别
2021/05/20 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
Opencv中cv2.floodFill算法的使用
2021/06/18 Python
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python