概念
在一个方法中定义好算法的整体流程结构,把一些具体的步骤延迟到子类中去实现
应用场景
一些业务场景整体流程详细,只有几个步骤有区别。使用模板方法模式能够避免编写相同流程中重复的代码

基本结构

1)抽象类(AbstractClass):定义模板方法和基本流程骨架,声明一些抽象操作让子类实现
2)具体子类(ConcreteClass):实现父类定义的抽象步骤,完成特定子类自己的逻辑
代码实现
以 “订单处理流程” 为例
抽象类
提供模板方法和公共流程。
抽象方法在公共流程中正常调用,交由继承的子类实现
abstract class OrderProcessTemplate {
// 模板方法,定义了订单处理的固定步骤
public final void processOrder() {
checkStock();
pay();
deliver();
notifyCustomer();
}
// 校验库存的步骤,所有订单都需要
protected void checkStock() {
System.out.println("检查库存");
}
// 支付步骤,交由具体子类实现
protected abstract void pay();
// 发货步骤,交由具体子类实现
protected abstract void deliver();
// 通知客户的步骤,所有订单都需要
protected void notifyCustomer() {
System.out.println("通知客户订单处理完成");
}
}
具体子类
继承抽象类,实现抽象方法
class PhysicalProductOrder extends OrderProcessTemplate {
@Override
protected void pay() {
System.out.println("支付实物商品的订单");
}
@Override
protected void deliver() {
System.out.println("发货实物商品");
}
}
class VirtualProductOrder extends OrderProcessTemplate {
@Override
protected void pay() {
System.out.println("支付虚拟商品的订单");
}
@Override
protected void deliver() {
System.out.println("通过邮件发送虚拟商品");
}
}
客户端调用
使用抽象类作为类型,通过子类new创建
public class Client {
public static void main(String[] args) {
System.out.println("处理实物商品订单:");
OrderProcessTemplate physicalOrder = new PhysicalProductOrder();
physicalOrder.processOrder(); // 调用模板方法
System.out.println("n处理虚拟商品订单:");
OrderProcessTemplate virtualOrder = new VirtualProductOrder();
virtualOrder.processOrder(); // 调用模板方法
}
}
优缺点
优点
1)代码复用性高
2)方便扩展:扩展新流程,只需继承抽象类即可
缺点
1)不够灵活:子类只能操作父类流程中的某些步骤
