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+dbfile开发小型留言本
Oct 09 PHP
MySql中正则表达式的使用方法描述
Jul 30 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
PHP处理excel cvs表格的方法实例介绍
May 13 PHP
PHP中把stdClass Object转array的几个方法
May 08 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
Jul 18 PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 PHP
php字符串函数学习之strstr()
Mar 27 PHP
php socket通信简单实现
Nov 18 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
PHP PDOStatement::setAttribute讲解
Feb 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使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
JavaScript函数详解
2015/02/27 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
javascript操作cookie
2017/01/17 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
python实现图书管理系统
2018/03/12 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
拾金不昧表扬信范文
2014/01/11 职场文书
一帮一活动总结
2014/05/08 职场文书
教师听课评语大全
2014/12/31 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书