概念
一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
使用场景
- 当要完成一件事情,它有固定的程序流程,但某些步骤是自定义的,使用模板方法
- 当需要创建框架时,在超类中提供一个基础的方法,达到代码的复用,并允许子类指定行为
示例:
//抽象类
public abstract class templateClass {
//模板方法,用final修饰,不允许子类覆盖。模板方法定义了流程(算法) a->b->c
final void templateFun(){
a();
b();
c();
}
//a步骤
void a(){
System.out.println("第一步: a");
}
//b步骤 抽象方法:子类必须实现
abstract void b();
//c
void soak(){
System.out.println("第三步: c");
}
}
子类one实现
public class One extends templateClass{
@Override
void b() {
System.out.println("第二步: one-b");
}
}
子类two实现
public class Two extends templateClass{
@Override
void b() {
System.out.println("第二步: two-b");
}
}
测试
public class Test {
public static void main(String[] args){
System.out.println("one步骤 a->b->c");
templateClass oneTemplateClass = new One();
oneTemplateClass.templateFun();
System.out.println("two步骤 a->b->c");
templateClass twoTemplateClass = new Two();
twoTemplateClass.templateFun();
}
}
模板模式之钩子方法
//抽象类
public abstract class templateClass {
//模板方法,用final修饰,不允许子类覆盖。模板方法定义了流程(算法) a->b->c
final void templateFun(){
a();
b();
if(isRunC()){
c();
}
}
//a步骤
void a(){
System.out.println("第一步: a");
}
//b步骤 抽象方法:子类必须实现
abstract void b();
//c
void soak(){
System.out.println("第三步: c");
}
//钩子方法,是否执行c步骤
boolean isRunC(){
return true;
}
}
子类one实现
public class One extends templateClass{
@Override
void b() {
System.out.println("第二步: one-b");
}
////覆盖钩子方法
@Override
boolean isRunC(){
return false;
}
}
子类two实现
public class Two extends templateClass{
@Override
void b() {
System.out.println("第二步: two-b");
}
//覆盖钩子方法
@Override
boolean isRunC(){
return true;
}
}
测试
public class Test {
public static void main(String[] args){
System.out.println("one步骤 a->b->c");
templateClass oneTemplateClass = new One();
oneTemplateClass.templateFun();
System.out.println("two步骤 a->b->c");
templateClass twoTemplateClass = new Two();
twoTemplateClass.templateFun();
}
}