Template Method(模板方法模式)

---- 将具体处理交给子类

Template Method 就是定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤 。

简单地说就是 用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体的行为。

应用场景

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

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

  • 控制子类扩展。在父类的模板方法中调用钩子操作,子类可以重定义钩子操作。简单地说就是在父类的模板方法中调用默认方法,子类可以重定义这些默认方法。

    钩子操作(hook operation):它提供了缺省的行为,子类可以在必要时进行扩展。一个钩子操作在缺省操作通常是一个空操作。

    很重要的一点是模板对象应该指明哪些操作是钩子操作(可以被重定义)以及哪些是抽象操作(必须被重定义)。要幼小的重用一个抽象类,子类编写者必须明确了解哪些操作是设计为有待重定义的。

模式参与者

  • AbstractClass 抽象类

    • 定义抽象的原语操作(primitive operation),具体的子类将从定义它们以实现一个算法的各步骤。

    • 实现一个模板方法,定义一个算法的骨架,该模板方法不仅调用原语操作,也调用定义在AbstractClass或者其他对象中的操作。

  • ConcreteClass 具体类

    • 实现原语操作以完成算法中与特定子类相关的步骤。

  • ConcreteClassAbstractClass 来实现算法中不变的步骤。

类图结构

代码示例

<?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】的更多相关文章

  1. 设计模式13:Template Method 模板方法模式(行为型模式)

    Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...

  2. 设计模式 : Template method 模板方法模式 -- 行为型

      设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...

  3. 设计模式(22)--Template Method(模板方法模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声 ...

  4. Template Method - 模板方法模式

    1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...

  5. 设计模式C++学习笔记之九(Template Method模板方法模式)

      模板模式也是相当简单的一种模式,而且是比较常用的.模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些 ...

  6. 设计模式学习笔记——Template Method模板方法模式

    可能是最简单的设计模式. 而且你我都用过而不自知. 因为,模板方法模式也者,就是面向对象中的继承.公用部分放在父类,子类继承父类,然后扩展.呵呵.

  7. 设计模式的征途—17.模板方法(Template Method)模式

    在现实生活中,很多事情都需要经过几个步骤才能完成,例如请客吃饭,无论吃什么,一般都包含:点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单=>吃东西=>买单.在这3个步骤中, ...

  8. Template Method 模板方法

      简介 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的细节 抽象模板AbstractClass的方法分为两类: 基本 ...

  9. Template Method 模板方法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. python_集合

    >>> import random>>> import time>>> x=list(range(10000))>>> y=se ...

  2. java ArrayList集合

    ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类).在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来 ...

  3. node.js 使用forever守护进程

    //forever的安装:npm install forever -g//使用forever启动守护进程:forever start 路径/your_app.js//关闭守护进程:forever st ...

  4. app后端设计(6)-- LBS

    在LBS的应用中,一个基本的需求是查找附近的用户,现在有两种做法: 1. 使用mysql的空间数据库,具体做法参考:http://blog.sina.com.cn/s/blog_a48af8c0010 ...

  5. 我们的java基础到底有多差 一个视频引发的感想

    以此文来警示自己. 大三要结束了. 我从大一下学期开始接触java,两年半了,期间有很努力的自学,也参与了一下项目,满以为自己的java基础应该不错,但今天在网上看了一个视频才发现自己学的是多么的&q ...

  6. &amp;

    在 xml 中,不能直接使用 '&' 表示 '&',要转译为 '&'  (转译序列个字符不能有空格,区分大小写,以';'结束,不要丢了分号哦 ;    amp;不是" ...

  7. SQL Server 日志和代理的错误日志

    本文介绍的日志不是事务日志,而是SQL Server 日志和代理的错误日志,按照主体把错误日志分为SQL Server.SQL Server Agent.Database Mail,以及 Window ...

  8. 用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

  9. objectid.go源码阅读

    )) } // func), ), ), ), ])<<])<<)]) } //获取])<<])<<])<<]), //转化为十进制的int ...

  10. api_request.go

    && !strings.HasPrefix(endpoint, "https") {             endpoint, err = httpsEndpoi ...