- 使用场景:
实现一个算法,整体结构很固定,但对某些特定的功能是易变的,将特定的功能抽象出来,供子类实现。(子类继承父类时,必须要实现父类的抽象方法)
定义模板方法:
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();
}
}
定义实现类:
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("我要取款!!!");
}
}
在开发中常用到的场景:
非常频繁,在各个框架,类库中都有它的影子。例如:
数据库访问的封装,junit单元测试,servlet中关于doGet/doPost方法调用,Hibernate中模板程序,spring中jdbcTemplate,HibernateTemplate等