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 discuz 主题表和回帖表的设计
Mar 13 PHP
PHP 数组基础知识小结
Aug 20 PHP
php实现利用phpexcel导出数据
Aug 24 PHP
php结合正则获取字符串中数字
Jun 19 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
twig里使用js变量的方法
Feb 05 PHP
Symfony2联合查询实现方法
Mar 18 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
PHP实现websocket通信的方法示例
Aug 28 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 PHP
PHP字符串与数组处理函数用法小结
Jan 07 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 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+DBM的同学录程序(3)
2006/10/09 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
两个Javascript小tip资料
2010/11/23 Javascript
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
js给selected添加options的方法
2015/05/06 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
python获取mp3文件信息的方法
2015/06/15 Python
Python实现堆排序的方法详解
2016/05/03 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
python 简单的调用有道翻译
2020/11/25 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
会计职业生涯规划范文
2014/01/04 职场文书
办理暂住证介绍信
2014/01/11 职场文书
公益活动邀请函
2014/02/05 职场文书
宾馆安全管理制度
2015/08/06 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
python3实现无权最短路径的方法
2021/05/12 Python
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
JS的深浅复制详细
2021/10/16 Javascript