GOF23设计模式之模板方法模式(template method)
一、模板方法模式概述
模板方法模式是编程中经常使用的模式。它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。
(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)的更多相关文章
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 二十四种设计模式:模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...
- 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释
模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...
- 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释
模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...
- 设计模式 - 模板方法模式(template method pattern) 具体解释
模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...
- 模板方法模式(Template Method Pattern)——复杂流程步骤的设计
模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...
- 模板方法模式-Template Method(Java实现)
模板方法模式-Template Method 在模板模式中, 处理的流程被定义在父类中, 而具体的处理则交给了子类. 类关系图很简单: Template接口 这里定义了子类需要实现的方法(before ...
随机推荐
- C++复习13.虚析构函数知识
C++ 虚析构函数 20131010 在C++中的虚函数作用是实现基于继承机制的多态,但是我们好像忽略了一种情况,就是虚析构函数.在C++继承机制中,虽然构造函数是不可以使用虚函数声明,但是析构函数是 ...
- UML_01_画图工具
一.推荐工具 1.processon 在线画图,类型丰富 www.processon.com 2.StarUML staruml.io 破解方法 StarUML 3.0.2 (Crack + Keyg ...
- LeetCode OJ:Regular Expression Matching(正则表达式匹配)
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- 【转】OpenWRT开发自定义应用方法
[转]OpenWRT开发自定义应用方法 转自:http://blog.csdn.net/rudyn/article/details/38616783 OpenWRT编译成功完成后,所有的产品都会放在编 ...
- android mvp RxJava 框架结构分析
一个MVP结构:M是model,V是Fragment,P是提供者,P持有V和Model,控制获取数据并给V赋值.(结合了RXJava Retrofit和okHttp)
- 动态加载vs静态加载
动态加载: 1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存. 2:可以在没有dll时候发现,而不致程序报错. 3:加载 ...
- Android 仿微信朋友圈查看
项目要做一个类似于这样的功能,就做了. 项目下载地址:http://download.csdn.net/detail/u014608640/9917626 一,看下效果: 二.activity类 pu ...
- Inception 初探
1,安装 下载组件 wget clone https:/github.com/mysql-inception/inception.git rz ll unzip inception-master.zi ...
- python类中self是什么
参考文献:http://www.cnblogs.com/linuxcat/archive/2012/01/05/2220997.html 注: (1)self在定义类的方法时是必须有的. (2)调用时 ...
- CF1109B Sasha and One More Name
CF1109B Sasha and One More Name 构造类题目.仔细看样例解释能发现点东西? 结论:答案只可能是 \(Impossible,1,2\) . \(Impossible:\) ...