交给子类: Template Method(模板方法模式)【PHP】
Template Method(模板方法模式)
---- 将具体处理交给子类

Template Method 就是定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤 。
简单地说就是 用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体的行为。
应用场景
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
控制子类扩展。在父类的模板方法中调用钩子操作,子类可以重定义钩子操作。简单地说就是在父类的模板方法中调用默认方法,子类可以重定义这些默认方法。
钩子操作(hook operation):它提供了缺省的行为,子类可以在必要时进行扩展。一个钩子操作在缺省操作通常是一个空操作。
很重要的一点是模板对象应该指明哪些操作是钩子操作(可以被重定义)以及哪些是抽象操作(必须被重定义)。要幼小的重用一个抽象类,子类编写者必须明确了解哪些操作是设计为有待重定义的。
模式参与者
AbstractClass 抽象类
定义抽象的原语操作(primitive operation),具体的子类将从定义它们以实现一个算法的各步骤。
实现一个模板方法,定义一个算法的骨架,该模板方法不仅调用原语操作,也调用定义在AbstractClass或者其他对象中的操作。
ConcreteClass 具体类
实现原语操作以完成算法中与特定子类相关的步骤。
ConcreteClass 靠 AbstractClass 来实现算法中不变的步骤。
类图结构

代码示例
<?php
abstract class AbstractClass { // 抽象模板角色
// 模板方法 调用基本方法组装顶层逻辑
public function templateMethod() {
$this->primitiveOperation1();
$this->primitiveOperation2();
}
// 基本方法
abstract protected function primitiveOperation1();
abstract protected function primitiveOperation2();
} class ConcreteClass extends AbstractClass { // 具体模板角色
protected function primitiveOperation1(){}
protected function primitiveOperation2(){} } $class = new ConcreteClass();
$class->templateMethod();
?>
拓展思路
可以使逻辑思路处理通用化
Template Method 优点在于在父类中编写了公共算法,因此无需在每个子类中在编写算法。
父类与子类之间的协作
在Template Method模式中,父类和子类是紧密联系、共同工作的。因此,在子类中实现父类中申明的抽象方法时,必须要理解这些抽象方法被调用的时机。在看不到父类源代码的情况下,想要编写子类是非常困难的。
相关模式
Factory Method 模式
Factory Method 模式是将 Template Method 模式用于生成实例的一个典型例子。
Strategy 模式
在 Template Method 模式中,可以使用继承改变程序的行为。这是因为 Template Method 模式在父类中定义程序行为的框架,在子类中决定具体的处理。
与此相对的是 Strategy 模式,它可以使用委托改变程序的行为。与 Template Method 模式中改变部分程序行为不同的是,Strategy 模式用于替换整个算法。
交给子类: Template Method(模板方法模式)【PHP】的更多相关文章
- 设计模式13:Template Method 模板方法模式(行为型模式)
Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...
- 设计模式 : Template method 模板方法模式 -- 行为型
设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...
- 设计模式(22)--Template Method(模板方法模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声 ...
- Template Method - 模板方法模式
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...
- 设计模式C++学习笔记之九(Template Method模板方法模式)
模板模式也是相当简单的一种模式,而且是比较常用的.模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些 ...
- 设计模式学习笔记——Template Method模板方法模式
可能是最简单的设计模式. 而且你我都用过而不自知. 因为,模板方法模式也者,就是面向对象中的继承.公用部分放在父类,子类继承父类,然后扩展.呵呵.
- 设计模式的征途—17.模板方法(Template Method)模式
在现实生活中,很多事情都需要经过几个步骤才能完成,例如请客吃饭,无论吃什么,一般都包含:点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单=>吃东西=>买单.在这3个步骤中, ...
- Template Method 模板方法
简介 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的细节 抽象模板AbstractClass的方法分为两类: 基本 ...
- Template Method 模板方法 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- 想做微信小程序第三方代理,各位觉得一键生成平台能赚到钱吗?
这几年生意不景气,这是很多人的共识.从2009年开始,各种专家就判断"明年经济是最差的一年."然后,这个明年,一直"明"到了2018年,到最后,我们发现,经济就 ...
- robot framework之弹出窗口的处理关键字实战
1.1 弹出窗口的处理关键字 5.8.1 Alert Should Be Present关键字 按F5 查看Alert Should Be Present关键字的说明,如下图
- Netflix性能监控工具Vector
简介: Vector是Netflix开源的主机级性能监控框架,向每位工程师的浏览器提供精心挑选的高分辨率系统和应用程序指标. 登录到系统并从shell运行大量命令是一种选择,但是通常涉及的复杂性可能成 ...
- 论文笔记(2):A fast learning algorithm for deep belief nets.
论文笔记(2):A fast learning algorithm for deep belief nets. 这几天继续学习一篇论文,Hinton的A Fast Learning Algorithm ...
- 【转】mysql 中int类型字段unsigned和signed的区别
转自https://www.cnblogs.com/wangzhongqiu/p/6424827.html 用法: mysql> CREATE TABLE t ( a INT UNSIGNED, ...
- Xor Sum 01字典树 hdu4825
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- 为什么我离开Mac for Windows:苹果已经放弃了[译]
为什么我离开Mac for Windows:苹果已经放弃了[译] 如果你问任何知道我的人,我可能是他们知道的最大的苹果粉丝.要求提供什么电脑可以获得的建议,我几乎肯定会告诉你MacBook Pro,还 ...
- Python实现猜数字游戏1.0版
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=702 """ 功能: 随机生成一个数字,最多有3次猜测机会,如果第一次没有猜对,则从第 ...
- hibulder中使用git教程
https://jingyan.baidu.com/article/25648fc19c14839191fd0027.html
- SublimeText 自带格式化代码功能
其实sublime自身就有格式化命令,就不再安装插件,位置在[Preferences]->[Key Bindings]->[User]中, 中文版的位置在 [首选项]->[按键 ...