模版方法模式(Template Pattern):
定义一个操作中的算法的骨架,而将一些步骤延迟到子类。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(Define the skeleton of an algorithm inan operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing thealgorithm’s structure.)
核心:处理步骤父类中定义好,具体实现延迟到子类实现。
什么时候用到模板方法模式:实现一个算法时,整体步骤很固定。但是,某些部分易变,易变部分可以抽象出来,供子类实现。
开发中常见的场景:非常频繁,各个框架,类库中都有他的影子。比如:
- 数据库访问的封装;
- Junit单元测试;
- servlet中关于doGet/doPost方法调用;
- Hibernate中模板程序;
- spring中JDBCTemplate , HibernateTemplate等
案例:比如说客户到银行办理业务,大致有以下三个过程:
- 取号排队;
- 办理具体业务 (存钱,转账,理财等);
- 对银行工作人员进行评分;
用模板方法模式,代码实现如下:
package designpattern.templatemethod;
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();
}
}
package designpattern.templatemethod;
public class Client {
public static void main(String[] args) {
BankTemplateMethod btm = new DrawMoney();
btm.process();
//采用匿名内部类
BankTemplateMethod btm2 = new BankTemplateMethod() {
@Override
public void transact() {
System.out.println("我要存钱!");
}
};
btm2.process();
BankTemplateMethod btm3 = new BankTemplateMethod() {
@Override
public void transact() {
System.out.println("我要理财!我这里有2000万韩币");
}
};
btm3.process();
}
}
class DrawMoney extends BankTemplateMethod {
@Override
public void transact() {
System.out.println("我要取款!!!");
}
}
执行结果如下图所示:
如果想了解更多设计模式,可点击:设计模式概述 以及 23种设计模式的介绍