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 ...
随机推荐
- 十八、dbms_repair(用于检测,修复在表和索引上的损坏数据块)
1.概述 作用:用于检测,修复在表和索引上的损坏数据块. 2.包的组成 1).admin_tables语法:dbms_repair.admin_tables(table_name in varchar ...
- ffmpeg 命令小记
指定格式转码 ffmpeg -i 1.mp4 -c:v libx264 -c:a aac -y 1.flv 等时长转为m3u8格式 ffmpeg -i 1.avi -c:v libx264 -c:a ...
- Deepgreen DB简介(转)
原文链接 Deepgreen DB 全称 Vitesse Deepgreen DB,它是一个可扩展的大规模并行(通常称为MPP)数据仓库解决方案,起源于开源数据仓库项目Greenplum DB(通 ...
- 微信小程序自定义tabbar的问题
个人感觉小程序的tab样式自定义的能力有所欠缺,不够美观,于是今天自己diy了一个tab 测试的时候发现,无论是使用navigator跳转(会出现点击的效果)还是用bindtap(触摸),因为没有定义 ...
- 【跟着stackoverflow学Pandas】add one row in a pandas.DataFrame -DataFrame添加行
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- Kotlin Reference (三) Coding Conventions
most from reference 命名规则 1.使用驼峰式命名规则,尽量避免在命名中使用下划线 2.类型以大写字母开头 3.方法和属性以小写字母开头 4.使用4个空格缩进 5.public的方法 ...
- 我也说说Emacs吧(2) - Emacs其实就是函数的组合
Emacs本质上是函数的组合 从帮助上看emacs有何不同 Vim和Sublime Text等编辑器,本质上是一个编辑器. 比如我们看看vim的帮助,是这个风格的,比如我要看i命令的帮助: <i ...
- python 多维list声明时的小问题
a=[[]]*3 a Out[18]: [[], [], []] a[0].append(1) a Out[20]: [[1], [1], [1]] b=[[] for _ in range(3)] ...
- C# http post上传文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- IOS开发 static关键字的作用
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值: (2)在模块内的 static 全局变量可以被模块内所 ...