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 5.0对象模型深度探索之绑定
Sep 05 PHP
用PHP生成静态HTML速度快类库
Mar 18 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
PHP 冒泡排序算法的实现代码
Aug 08 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
Jun 21 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
php+ajax登录跳转登录实现思路
Jul 31 PHP
PHP Cookie学习笔记
Aug 23 PHP
CI框架数据库查询缓存优化的方法
Nov 21 PHP
PHP中非常有用却鲜有人知的函数集锦
Aug 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
php输入数据统一类实例
2015/02/23 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
php输出形式实例整理
2020/05/05 PHP
jQuery版仿Path菜单效果
2011/12/15 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
python实现ping的方法
2015/07/06 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
Python3标准库总结
2019/02/19 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
领导的自我鉴定
2013/12/28 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android