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 相关文章推荐
一个改进的UBB类
Oct 09 PHP
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
PHP 日期时间函数的高级应用技巧
Oct 10 PHP
PHP正则的Unknown Modifier错误解决方法
Mar 02 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
Apr 26 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
php简单中奖算法(实例)
Aug 15 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
PHP区块查询实现方法分析
May 12 PHP
微信小程序和php的登录实现
Apr 01 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安全配置
2006/12/06 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
Python使用redis pool的一种单例实现方式
2016/04/16 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
python通过实例讲解反射机制
2019/10/17 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
幼教毕业生自我鉴定
2014/01/12 职场文书
无财产无子女离婚协议书范文
2014/09/14 职场文书
年底个人总结范文
2015/03/10 职场文书
开除通知书范本
2015/04/25 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
Redis高并发缓存架构性能优化
2022/05/15 Redis