基本定义:
模板方法模式(Template Method Pattern) 是定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。简单的说就是模板类提供了结构或者步骤,而子类在不改变步骤的前提下,实现自己特有的细节。模板类和子类是一种继承关系。
举例:
定义一个抽象的模板类,模板类包含若干基本方法,模板方法(统一调用模板方法),钩子方法,确认模板方法中的执行顺序和结果(方便子类扩展,符合开闭原则)。除模板方法外,其他方法修饰为protected 符合迪米特法则。子类实现重写父类的基本方法和钩子方法。
/**
* 模板类
*/
public abstract class Template {
//基本方法1
protected abstract void dosomething1();
//基本方法2
protected abstract void dosomething2();
//模板方法
public void templateMethod(){
dosomething1();
if(isOk()){
dosomething2();
}
}
//钩子方法
protected abstract boolean isOk();
}
/**
* 实现子类
*/
public class TemplateImpl extends Template {
@Override
protected void dosomething1() {
System.out.println("执行了1");
}
@Override
protected void dosomething2() {
System.out.println("执行了2");
}
@Override
protected boolean isOk() {
return false;
}
}
测试类
/**
* 模板方法测试类
*/
public class TestTemplate {
public static void main(String[] args) {
Template template = new TemplateImpl();
template.templateMethod();
}
}
执行结果:
执行了1
总结:
模板方法模式理解起来相对比较容易,而且使用场景十分广泛。其核心思想是父类定义算法结构,子类进行细节实现。但是同时受到父类的约束。(同时为了不让子类改变父类的方法骨架模板方法可以定义为final)。
使用场景:
当多个类存在共同的方法调用且同时行为类型就可以抽取成一个抽象类,将核心方法抽取为模板方法。通过钩子方法进行约束。
优点:
定义了核心框架,对于简单业务开发更加简单,流程更加清晰。增加了代码的重复利用。
缺点:
每次扩展一种业务都需要新增一个子类,加大了代码量。继续关系,实现细节交由子类实现,子类的执行结果往往会影响父类,复杂逻辑不太适用。同时模板方法真正调用的是父类的方法,代码可读性降低。