一、模板方法模式概述

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

  (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. I/O复用服务器端+回声客户端

    并发服务器的第二种实现方法:I/O复用 服务器端: #include <arpa/inet.h> #include <unistd.h> #include <algori ...

  2. Myeclipse WEB工程JSP使用JNDI 数据库连接池连接Mysql数据库

    在网上查了很多,最后实现了.下面写一下过程: 首先,在WEBROOT/META-INF下建一个文件context.xml,内容为: <?xml version="1.0" e ...

  3. (转)MapReduce Design Patterns(chapter 2 (part 2))(三)

    Median and standard deviation 中值和标准差的计算比前面的例子复杂一点.因为这种运算是非关联的,它们不是那么容易的能从combiner中获益.中值是将数据集一分为两等份的数 ...

  4. (转) MapReduce Design Patterns(chapter 2 (part 1))(二)

     CHAPTER 2 .Summarization Patterns 随着每天都有更多的数据加载进系统,数据量变得很庞大.这一章专注于对你的数据顶层的,概括性意见的设计模式,从而使你能扩展思路,但可能 ...

  5. TypeError: pivot_table() got an unexpected keyword argument 'rows'

    利用Python进行数据分析>第二章,处理MovieLens 1M数据集,有句代码总是报错: mean_rating = data.pivot_table('rating', rows='tit ...

  6. spring boot 教程(一) 构建我的第一个Spring boot

    Spring Boot特点 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 5. 提供生产就绪型功能,如指标, ...

  7. liunx工具学习之taskset

    当你优化多线程任务的时候,发现某个线程在不同的核上跳转较大,从而耗费CPU的时候想法肯定是想可以把对应线程绑定到特定的核上,可是每次这样操作每次尝试看效果的时候都要重启进程,那有没有一个工具可以直接处 ...

  8. linux中使用yum进行软件的安装

    yum 仓库 配置信息/etc/yum.reposd/ [linuxcast]name="this is soft ware"baseurl="http://ww.bai ...

  9. (转)3D LUT

    这是 @Air君·Saunato·LoFoTo 大神运用3DLUT的作品 这是借用昔年大神 @昔年Olivia 用3DLUT的片片 http://paopaopaojiao.lofter.com/po ...

  10. cocos studio pageview看不到indicator指示点

    发现如果在cocos studio里操作给PageView创建页面元素时,即使setIndicatorEnabled为true也看到下方的指示点,必须调用addWidgetToPage或者insert ...