一、意图

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

二、模板方法模式结构图

三、模板方法模式中主要角色抽象模板(AbstractClass)角色:定义一个或多个抽象方法让子类实现。这些抽象方法叫做基本操作,它们是顶级逻辑的组成部分。

定义一个模板方法。这个模板方法一般是一个具体方法,它给出顶级逻辑的骨架,而逻辑的组成步骤在对应的抽象操作中,这些操作将会推迟到子类中实现。同时,顶层逻辑也可以调用具体的实现方法

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

每个抽象模板可以有多个具体模板与之对应,而每个具体模板有其自己对抽象方法(也就是顶层逻辑的组成部分)的实现,从而使得顶层逻辑的实现各不相同。

四、模板方法模式适用场景

1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

3、控制子类扩展。

五、模板方法模式与其它模式1、策略模式(strategy模式):模板方法使用继承来改变算法的部分,策略模式使用委托来改变整个算法。区别在于封闭的变化不同,一个变化的部分,一个变化的是整体。

2、工厂方法模式(factory method模式):Factory Method模式常被模板方法调用。

六、模板方法模式PHP示例

/**

* 抽象模板角色

* 定义抽象方法作为顶层逻辑的组成部分,由子类实现

* 定义模板方法作为顶层逻辑的架子,调用基本方法组装顶层逻辑

*/

abstract class AbstractClass {

/**

* 模板方法 调用基本方法组装顶层逻辑

*/

public function templateMethod() {

echo 'templateMethod begin.
';

$this->primitiveOperation1();

$this->primitiveOperation2();

echo 'templateMethod end.
';

}

/**

* 基本方法1

*/

abstract protected function primitiveOperation1();

/**

* 基本方法2

*/

abstract protected function primitiveOperation2();

}

/**

* 具体模板角色

* 实现父类的抽象方法

*/

class ConcreteClass extends AbstractClass{

/**

* 基本方法1

*/

protected function primitiveOperation1() {

echo 'primitiveOperation1
';

}

/**

* 基本方法2

*/

protected function primitiveOperation2(){

echo 'primitiveOperation2
';

}

}

/**

* 客户端

*/

class Client {

/**

* Main program.

*/

public static function main() {

$class = new ConcreteClass();

$class->templateMethod();

}

}

Client::main();

?>

七、模板方法模式模板方法是一种代码复用的基本技术,模板方法导致一种反射的控制结构,这指的是一个父类调用子类的操作。

其实现过程:准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。

八、重构的原则重构时应当遵守的原则是:将行为以是移到结构的高端,而将状态尽量移动到结构的低端。

1、应当要所行为而不是状态定义一个类。

2、在实现行为是,是用抽象状态而不是用具体状态。

3、给操作划分层次。

4、将状态的确认推迟到子类中。在父类中,如果需要状态属性的话,可以调用抽象的取值方法,而将抽象的取值方法的实现放到具体子类中。

如果可以遵守以上的而,那么就可以在等级结构中将接口与实现分离,将抽象与具体分离,从而保证代码可以最大限度的被复用。

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

学习php开发步骤,学习php设计模式 php实现模板方法模式相关推荐

  1. 咖啡泡JAVA_java《Head First 设计模式》之模板方法模式——冲泡咖啡和茶

    <Head First 设计模式>之模板方法模式--冲泡咖啡和茶 模板方法模式(Template) 在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变 ...

  2. Java描述设计模式(19):模板方法模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付.现在基于模板方法模式进行该过程描述. public c ...

  3. 设计模式系列之模板方法模式

    1 定义 模板方法模式定义了一个算法的步骤,并允许子类为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤. <百度百科> 模板方法模式,首先从名字看 ...

  4. 嵌入式开发需要学mysql吗_学习嵌入式开发需要学习哪些课程?如何学习?

    针对很多的大学生嵌入式开发初学者来说,对嵌入式开发的学习还很迷茫.今天信盈达嵌入式培训老师给出参考建议:首先:嵌入式开发需要学习哪些课程?因为嵌入式开发的方向不同,所学习的内容会有所区别,但是无论是哪 ...

  5. 23种设计模式之:模板方法模式

    转载地址:https://blog.csdn.net/zhengzhb/article/details/7405608 整理的设计模式实例:https://github.com/jinchuanchu ...

  6. 小话设计模式五:模板方法模式

    模板方法模式定义: 定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板方法解析: 模板方法模式是比较简单的一种设计 ...

  7. 设计一个扩展自抽象类geometricobject_设计模式4之模板方法模式

    背景 在开发中,你肯定有遇到过这样一种场景:你知道某个方法的关键步骤以及执行顺序,但是里面有的具体步骤并清楚.你会怎么做? 比如你早上起床到公司,我们分解步骤: "起床洗漱吃早餐乘坐交通工具 ...

  8. 设计模式(十):模板方法模式

    目录 1.整体框架 2.介绍 2.1.定义 2.2.作用 2.3.解决的问题 3.认识模版方法模式 3.1.变与不变 3.2.好莱坞法则 3.3.对设计原则的体现 4.模式原理 4.1.UML类图 & ...

  9. Java设计模式系列之——模板方法模式

    大事件 关注篮球或者喜欢逛社交网站的朋友们可能都知道,2019年10月5日,NBA休斯顿火箭队总经理莫雷在推特上发布了一张无知的涉港图片,引发全体中国人民的强烈抗议和不满,一时间舆论哗然,此后,NBA ...

最新文章

  1. Spring Cloud Feign的文件上传实现
  2. Atitit .linux 取回root 密码q99
  3. 安全问题-携程可能摊上大事了——崩溃原因分析
  4. 在指定文件夹下打开Jupyter Notebook
  5. opengl加载显示3D模型b3d类型文件
  6. lucene和elasticsearch的前世今生、elasticsearch的核心概念、elasticsearch核心概念 vs. 数据库核心概念(来自学习资料)
  7. numpy pytorch 接口对应_拆书分享篇深度学习框架PyTorch入门与实践
  8. oracle 锁问题的解决
  9. Python使用组合、排列和动态规划算法求解0-1背包问题
  10. ATL--创建简单的ATL之dll工程,添加类和类的接口并在MFC中调用
  11. DPDK 16.04/16.11.2 默认tx offload是关闭的引起tx vlan offload无效
  12. numpy广播机制小结
  13. 通过collect埋点_通过Collect UI查找每日界面设计灵感
  14. 64 ---- 平面与直线的位置关系
  15. 谈谈我在创业公司的感悟
  16. 石家庄网站建设公司详解企业网站建设方案策划
  17. react监听回车事件
  18. Discuz app打包app上架appstore小技巧
  19. 百度OCR API识别失败:Open api qps request limit reached 错误也许在这
  20. canvas 模拟地球绕太阳转动 月球绕地球转动

热门文章

  1. 吴恩达深度学习笔记(八) —— ResNets残差网络
  2. HDU 1011 Starship Troopers 树形+背包dp
  3. Python数据清理之数据质量
  4. Spring_自动装配
  5. 安装JDK后,未设置Path,也能执行java.exe的原因
  6. coreseek/sphinx CentOS6.4下安装
  7. sql单表简单的分页脚本
  8. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
  9. TFLite基础知识
  10. SQL SERVER 新增表、新增字段、修改字段 判断表是否存在