学习php设计模式 php实现模板方法模式


Posted in PHP onDecember 08, 2015

一、意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以在不改变一个算法的结构的情况下重定义该算法的某些特定的步骤【GOF95】
二、模板方法模式结构图

学习php设计模式 php实现模板方法模式

三、模板方法模式中主要角色
抽象模板(AbstractClass)角色: 定义一个或多个抽象方法让子类实现。这些抽象方法叫做基本操作,它们是顶级逻辑的组成部分。
定义一个模板方法。这个模板方法一般是一个具体方法,它给出顶级逻辑的骨架,而逻辑的组成步骤在对应的抽象操作中,这些操作将会推迟到子类中实现。同时,顶层逻辑也可以调用具体的实现方法

具体模板(ConcrteClass)角色:实现父类的一个或多个抽象方法,作为顶层逻辑的组成而存在。

每个抽象模板可以有多个具体模板与之对应,而每个具体模板有其自己对抽象方法(也就是顶层逻辑的组成部分)的实现,从而使得顶层逻辑的实现各不相同。
四、模板方法模式适用场景
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3、控制子类扩展。
五、模板方法模式与其它模式
1、策略模式(strategy模式):模板方法使用继承来改变算法的部分,策略模式使用委托来改变整个算法。区别在于封闭的变化不同,一个变化的部分,一个变化的是整体。
2、工厂方法模式(factory method模式):Factory Method模式常被模板方法调用。
六、模板方法模式PHP示例

<?php
/**
 * 抽象模板角色
 * 定义抽象方法作为顶层逻辑的组成部分,由子类实现
 * 定义模板方法作为顶层逻辑的架子,调用基本方法组装顶层逻辑
 */
abstract class AbstractClass {
 
  /**
   * 模板方法 调用基本方法组装顶层逻辑
   */
  public function templateMethod() {
    echo 'templateMethod begin.<br />';
    $this->primitiveOperation1();
    $this->primitiveOperation2();
    echo 'templateMethod end.<br />';
  }
 
  /**
   * 基本方法1
   */
  abstract protected function primitiveOperation1();
 
   /**
   * 基本方法2
   */
  abstract protected function primitiveOperation2();
}
 
/**
 * 具体模板角色
 * 实现父类的抽象方法
 */
class ConcreteClass extends AbstractClass{
  /**
   * 基本方法1
   */
  protected function primitiveOperation1() {
    echo 'primitiveOperation1<br />';
  }
 
   /**
   * 基本方法2
   */
  protected function primitiveOperation2(){
    echo 'primitiveOperation2<br />';
  }
 
}
 
/**
 * 客户端
 */
class Client {
 
   /**
   * Main program.
   */
  public static function main() {
    $class = new ConcreteClass();
    $class->templateMethod();
  }
}
 
Client::main();
?>

七、模板方法模式
模板方法是一种代码复用的基本技术,模板方法导致一种反射的控制结构,这指的是一个父类调用子类的操作。
其实现过程:准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。
八、重构的原则
重构时应当遵守的原则是:将行为以是移到结构的高端,而将状态尽量移动到结构的低端。
1、应当要所行为而不是状态定义一个类。
2、在实现行为是,是用抽象状态而不是用具体状态。
3、给操作划分层次。
4、将状态的确认推迟到子类中。在父类中,如果需要状态属性的话,可以调用抽象的取值方法,而将抽象的取值方法的实现放到具体子类中。
如果可以遵守以上的而,那么就可以在等级结构中将接口与实现分离,将抽象与具体分离,从而保证代码可以最大限度的被复用。

以上就是使用php实现模板方法模式的代码,还有一些关于模板方法模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
10个实用的PHP代码片段
Sep 02 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
php.ini 配置文件的深入解析
Jun 17 PHP
php中的静态变量的基本用法
Mar 20 PHP
php使用GeoIP库实例
Jun 27 PHP
Linux中为php配置伪静态
Dec 17 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 PHP
PHP的自定义模板引擎
Mar 24 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
PHP7正式版测试,性能惊艳!
Dec 08 #PHP
学习php设计模式 php实现命令模式(command)
Dec 08 #PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 #PHP
如何使用GDB调试PHP程序
Dec 08 #PHP
PHP MPDF中文乱码的解决方式
Dec 08 #PHP
PHP使用MPDF类生成PDF的方法
Dec 08 #PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 #PHP
You might like
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
解析php中const与define的应用区别
2013/06/18 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
php递归实现无限分类的方法
2015/07/28 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
php实现word转html的方法
2016/01/22 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
python3获取当前目录的实现方法
2019/07/29 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
教师求职自荐书
2014/06/14 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
2015年妇女工作总结
2015/05/14 职场文书
民事辩护词范文
2015/05/21 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
对Keras自带Loss Function的深入研究
2021/05/25 Python
python计算列表元素与乘积详情
2022/08/05 Python