PHP设计模式之模板模式定义与用法详解


Posted in PHP onDecember 20, 2018

本文实例讲述了PHP设计模式之模板模式定义与用法。分享给大家供大家参考,具体如下:

模板模式准备一个抽象类,将部分逻辑以具体方法以及具体构造形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

UML类图:

PHP设计模式之模板模式定义与用法详解

角色:

抽象模板角色(MakePhone):抽象模板类,定义了一个具体的算法流程和一些留给子类必须实现的抽象方法。

具体子类角色(XiaoMi):实现MakePhone中的抽象方法,子类可以有自己独特的实现形式,但是执行流程受MakePhone控制。

核心代码:

<?php
/**
 * Created by PhpStorm->
 * User extends Jang
 * Date extends 2015/6/10
 * Time extends 11 extends 06
 */
//抽象模板类
abstract class MakePhone
{
  protected $name;
  public function __construct($name)
  {
    $this->name=$name;
  }
  public function MakeFlow()
  {
    $this->MakeBattery();
    $this->MakeCamera();
    $this->MakeScreen();
    echo $this->name."手机生产完毕!<hr/>";
  }
  public abstract function MakeScreen();
  public abstract function MakeBattery();
  public abstract function MakeCamera();
}
//小米手机
class XiaoMi extends MakePhone
{
  public function __construct($name='小米')
  {
    parent::__construct($name);
  }
  public  function MakeBattery()
  {
    echo "小米电池生产完毕!<br/>";
  }
  public  function MakeCamera()
  {
    echo "小米相机生产完毕!<br/>";
  }
  public function MakeScreen()
  {
    echo "小米屏幕生产完毕!<br/>";
  }
}
//魅族手机
class FlyMe extends MakePhone
{
  function __construct($name='魅族')
  {
    parent::__construct($name);
  }
  public  function MakeBattery()
  {
    echo "魅族电池生产完毕!<br/>";
  }
  public  function MakeCamera()
  {
    echo "魅族相机生产完毕!<br/>";
  }
  public  function MakeScreen()
  {
    echo "魅族屏幕生产完毕!<br/>";
  }
}

调用客户端测试代码:

header("Content-Type:text/html;charset=utf-8");
//-------------------------模板模式---------------------
require_once "./Template/Template.php";
$miui=new XiaoMi();
$flyMe=new FlyMe();
$miui->MakeFlow();
$flyMe->MakeFlow();

运行结果:

小米电池生产完毕!
小米相机生产完毕!
小米屏幕生产完毕!
小米手机生产完毕!
--------------------------------------------------------------------------------
魅族电池生产完毕!
魅族相机生产完毕!
魅族屏幕生产完毕!
魅族手机生产完毕!
--------------------------------------------------------------------------------

适用场景及优势:

1、完成某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时。我们通常考虑用模板模式来处理。

2、当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

3、模板模式通过把不变的行为搬移到超级抽象类,去除子类中的重复代码来体现它的优势。模板模式提供了一个很好的代码复用平台。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
Jul 05 PHP
mysql数据库差异比较的PHP代码
Feb 05 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
Apr 08 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
THINKPHP2.0到3.0有哪些改进之处
Jan 04 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
PHP的引用详解
Feb 22 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 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
PHP获取星期几的常用方法小结
Dec 18 #PHP
You might like
用PHP读取RSS feed的代码
2008/08/01 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
在Python的Flask框架中使用模版的入门教程
2015/04/20 Python
Python Logging 日志记录入门学习
2018/06/02 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
python 实现的车牌识别项目
2021/01/25 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
软件测试工程师结构化面试题库
2016/11/23 面试题
远程教育心得体会
2014/01/03 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
学生个人自我鉴定
2014/03/26 职场文书
导游词400字
2015/02/13 职场文书
四年级语文教学反思
2016/03/03 职场文书
商业计划书范文
2019/04/24 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android