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 相关文章推荐
递归列出所有文件和目录
Oct 09 PHP
基于数据库的在线人数,日访问量等统计
Oct 09 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
PHP生成不同颜色、不同大小的tag标签函数
Sep 23 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
初识php MVC
Sep 10 PHP
php三元运算符知识汇总
Jul 02 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
PHP数学运算函数大汇总(经典值得收藏)
Apr 01 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
PHP验证类的封装与使用方法详解
Jan 10 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
Jan 04 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正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
js option删除代码集合
2008/11/12 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
《愚公移山》教学反思
2014/02/20 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
组工干部演讲稿
2014/09/02 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
个人党性分析材料
2014/12/19 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL