一、模板方法模式概述

  模板方法模式是编程中经常使用的模式。它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。

  (1)核心:

      处理某个流程的代码已经都定义好了,但是其中某个节点的代码暂时不能确定,因此,采用模板方法模式,将这个节点的代码转移到子类完成。

    即:处理步骤在父类中定义好,具体实现延迟到子类中定义。

  (2)什么时候采用模板方法模式?

      实现一个算法,整体步骤很固定,但是,某些部分需要经常改变,所以把这部分抽象出来,供子类实现。

二、模板方法模式场景导入

  客户到银行办理业务:

    (1)取号排队

    (2)办理具体取款/存款/理财等业务

    (3)反馈评分

  第一步和第三步固定,第二步易变,所以采用模板方法模式实现。

三、模板方法模式示例代码

 /**
* 抽象的模板方法类
* @author CL
*
*/
public abstract class BankTemplateMethod {
/**
* 具体实现方法:排队取号
*/
public void takeNumber() {
System.out.println("排队取号");
} /**
* 抽象方法:办理业务
* 钩子方法
*/
public abstract void transact(); /**
* 具体方法:反馈评分
*/
public void evaluate() {
System.out.println("反馈评分");
} /**
* 模板方法,将所有操作组合起来,一般子类不能重写
*/
public final void process() {
this.takeNumber(); this.transact(); //钩子方法。执行时,挂在哪个子类的方法上就执行哪个方法 this.evaluate();
}
}
 /**
* 取款业务
* @author CL
*
*/
public class DrawMoney extends BankTemplateMethod { @Override
public void transact() {
System.out.println("我要取款");
} }

  测试:

 /**
* 测试模板方法模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
//模板方法模式的三种实现方式 //第一种
BankTemplateMethod btm = new DrawMoney();
btm.process(); System.out.println("---------------------");
//第二种 使用匿名内部类
BankTemplateMethod btm2 = new BankTemplateMethod() { @Override
public void transact() {
System.out.println("我要存款");
}
}; btm2.process(); System.out.println("---------------------"); //第三种
new BankTemplateMethod() { @Override
public void transact() {
System.out.println("我要理财");
} }.process();
}
}
排队取号
我要取款
反馈评分
---------------------
排队取号
我要存款
反馈评分
---------------------
排队取号
我要理财
反馈评分

四、方法回调(钩子方法)

  (1)好莱坞原则 (Don't call me, we'll call you back)

  (2)在软件开发中,我们可以将call翻译为调用。子类不能调用父类,而通过父类调用子类。这些调用步骤已经在父类中写好,完全由父类控制整个过程。

五、模板方法模式常见开发应用场景

  (1)数据库访问的封装;

  (2)servlet 中关于 doGet / doPost 方法调用;

  (3)Junit 单元测试;

  (4)Hibernate 中模板程序;

  (5)Spring 中 JDBCTemplate、HibernateTemplate 等;

  (6)…………

GOF23设计模式之模板方法模式(template method)的更多相关文章

  1. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  2. 二十四种设计模式:模板方法模式(Template Method Pattern)

    模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...

  3. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

  4. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

  5. 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释

    模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...

  6. 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

    模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...

  7. 设计模式 - 模板方法模式(template method pattern) 具体解释

    模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...

  8. 模板方法模式(Template Method Pattern)——复杂流程步骤的设计

    模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...

  9. 模板方法模式-Template Method(Java实现)

    模板方法模式-Template Method 在模板模式中, 处理的流程被定义在父类中, 而具体的处理则交给了子类. 类关系图很简单: Template接口 这里定义了子类需要实现的方法(before ...

随机推荐

  1. 【BZOJ】3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3389 显然左端点排序后,依次取. 要考虑下一次取的方案: 待选点为a[j].x<=a[now] ...

  2. java程序设计基础篇 复习笔记 第三单元

    1 单向if语句 双向if语句 dangling else switch:char,byte,short,int 2 javax.swing.JOptionPane.showConfirmDialog ...

  3. Markdown_04_折叠语法

    目录 一.折叠语法 参考资料 一.折叠语法 主要使用的是 html5的 details标签 (1)示例如下: <details> <summary>折叠文本</summa ...

  4. Android学习笔记①——安卓工具的基本安装

    安卓已经出来很长时间了,网上的教程也有很多,怕以后忘记,就把网上大牛们的分享的知识自己在学习一下,也记录一下,如果能帮到别人,那是更好不过的! 鉴于现在的IDE工具来说,IDEA已经占据了java的半 ...

  5. Java基础学习-包装类

    package packaging; /*包装类: 是封装了基本数据类型的类,为了提供更多复杂方法 Integer: String---int 1.intvalue() 2.parseTnt() in ...

  6. LINUX系统下CIFS文件系统

    一.什么是CIFS CIFS(Common  Internet  File  System)文件系统,也叫通用网络文件系统:它可以使一台主机访问远程主机上共享出去的文件.CIFS使用的C/S模式(客户 ...

  7. HTML中Div、span、label标签的区别

    div与span 大家在初学div+css布局时,有很多困惑,在div与span的使用过程没觉得有一定的”章法”,觉得两个区别不大,在w3c的关于div和span的定义:div作为分割文档结构自然使它 ...

  8. boost::function和boost:bind取代虚函数

    以boost::function和boost:bind取代虚函数 这是一篇比较情绪化的blog,中心思想是"继承就像一条贼船,上去就下不来了",而借助boost::function ...

  9. Buildroot 使用默认配置

    /******************************************************************************** * Buildroot 使用默认配置 ...

  10. tcp流式套接字和udp数据报套接字编程区别

    1. 流式套接字采用字节流方式进行传输,而数据报套接字 使用数据报形式传输数据2. tcp套接字会产生粘包,udp有消息边界,不会形成粘包.3. tcp编程可以保证消息的完整性,udp则不能保证4. ...