模板方法TemplateMethod
就是钩子函数
模板已经写好了
重写方法,系统自动调用,都是模板方法
使用的时候面向接口编程,这就是模板方法
在我们开发业务逻辑的时候,可能会遇到流程复杂的逻辑,而这个复杂逻辑本身是可以拆解成多个小的行为,这些小的行为本身可能根据业务场景的不同而有所变化。
这里我们以转账流程为例,如下图所示,整个转账流程是固定的,但是“验证密码”“验证余额”和“扣除金额”这三步针对不同的银行卡,要调用不同银行的接口去完成。为了让整个复杂流程的代码具有更好的扩展性,我们一般会使用模板方法模式来处理。

在模板方法模式中,我们可以将复杂流程中每个步骤的边界确定下来,然后由一个“模板方法”定义每个步骤的执行流程,每个步骤对应着一个方法,这些方法也被称为“基本方法”。模板方法按照业务逻辑依次调用上述基本方法,来实现完整的复杂流程。
模板方法模式会将模板方法以及不需要随业务场景变化的基本方法放到父类中实现,随业务场景变化的基本方法会被定义为抽象方法,由子类提供真正的实现。
下图展示了模板方法模式的核心类,其中 template() 方法是我们上面描述的模板方法,part1() 方法和 part3() 方法是逻辑不变的基本方法实现,而 part2()、part4() 方法是两个随场景变化的基本方法。

我们可以通过模板方法控制整个流程的走向以及其中固定不变的步骤,子类来实现流程的某些变化细节,这就实现了“变化与不变”的解耦,也实现了“整个流程与单个步骤”的解耦。
当业务需要改变流程中某些步骤的具体行为时,直接添加新的子类即可实现,这也非常符合“开放-封闭”原则。另外,模板方法模式能够充分利用面向对象的多态特性,在系统运行时再选择一种具体子类来执行完整的流程,这也从另一个角度提高了系统的灵活性。
package com.deltaqin.designPattern.d05_templateMethod;
/**
* @author deltaqin
* @date 2021/3/27 10:14 上午
*/
// 在接口里面定义方法模板,不管具体实现
// 使用的时候面向接口编程,这就是模板方法
// 典型应用:controller调用service接口,不管具体实现,controller是对service抽象方法的组装
public class Demo {
public static void main(String[] args) {
F f = new C1();
f.m();
}
}
abstract class F {
public void m() {
op1();
op2();
}
abstract void op1();
abstract void op2();
}
class C1 extends F {
@Override
void op1() {
System.out.println("op1");
}
@Override
void op2() {
System.out.println("op2");
}
}
典型应用:
controller调用service接口,不管具体实现,controller是对service抽象方法的组装
posted on 2025-10-14 23:06 chuchengzhi 阅读(5) 评论(0) 收藏 举报
浙公网安备 33010602011771号