首先來看一下類圖

模板方法模式類圖
原理就是,通過抽象的父類來控制子類的行為,具體的行為由子類定義
1,定義一個抽象的父類將公共執(zhí)行部分抽取到父類中
public abstract class AbstractClass {
//基本方法
protected abstract void doSomething();
//基本方法
protected abstract void doAnything();
//模板方法
public final void templateMethod(){
/**
* 調(diào)用基本方法完成相關(guān)邏輯
*/
this.doSomething();
this.doAnything();
}
}
2,定義不同子類實現(xiàn)具體的執(zhí)行方法
public class ConcreteClass1 extends AbstractClass{
@Override
protected void doSomething() {
//業(yè)務(wù)邏輯處理
}
@Override
protected void doAnything() {
//業(yè)務(wù)邏輯處理
}
}
public class ConcreteClass2 extends AbstractClass{
@Override
protected void doSomething() {
//業(yè)務(wù)邏輯處理
}
@Override
protected void doAnything() {
//業(yè)務(wù)邏輯處理
}
}
3,調(diào)用執(zhí)行相應(yīng)方法
public class Main {
public static void main(String[] args){
AbstractClass abstractClass1 = new ConcreteClass1();
AbstractClass abstractClass2 = new ConcreteClass2();
//調(diào)用模板方法
abstractClass1.templateMethod();
abstractClass2.templateMethod();
}
}
這個模式非常簡單,可能我們都使用過只是不知道他的名字而已,這個模式也可以配合鉤子使用,在父類中定義鉤子,在之類中定義是否執(zhí)行公共方法,具體代碼如下
public abstract class AbstractClass {
//基本方法
protected abstract void doSomething();
//基本方法
protected abstract void doAnything();
//模板方法
public final void templateMethod(){
/**
* 調(diào)用基本方法完成相關(guān)邏輯
*/
this.doSomething();
//是否執(zhí)行公共算法中的某個方法
if (this.canDoAnything()){
this.doAnything();
}
}
/**
* 鉤子,是否可以執(zhí)行公共算法中的方法
* @return
*/
protected abstract boolean canDoAnything();
}