设计模式之模板方法模式
模板方法模式定义一个操作中的算法骨架,而将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。
解析这个定义:
- “算法骨架”,表明是定好了调用多个方法调用的框架顺序。
- “某些步骤延迟到子类”,延迟到子类说明框架由超类定义,“某些步骤”表明只是部分交由子类自定义,而还有一部分是由超类已经定义好了,由此可以表明超类必须是抽象类,而非接口,“某些步骤”相应的就是抽象方法。

// 抽象支付类 - 定义支付流程模板
public abstract class PaymentProcessor {
// 模板方法(final防止子类修改流程)
public final void processPayment(double amount, String orderId) {
validateParameters(amount, orderId);
boolean paymentResult = callPaymentGateway(amount, orderId);
logPayment(orderId, amount, paymentResult);
notifyPaymentResult(orderId, paymentResult);
}
// 公共方法 - 验证参数
private void validateParameters(double amount, String orderId) {
if (amount <= 0) {
throw new IllegalArgumentException("支付金额必须大于0");
}
if (orderId == null || orderId.isEmpty()) {
throw new IllegalArgumentException("订单ID不能为空");
}
}
// 抽象方法 - 子类必须实现
protected abstract boolean callPaymentGateway(double amount, String orderId);
// 公共方法 - 记录日志
private void logPayment(String orderId, double amount, boolean success) {
System.out.println("记录支付日志 - 订单:" + orderId
+ ", 金额:" + amount
+ ", 状态:" + (success ? "成功" : "失败"));
}
// 钩子方法 - 子类可选择覆盖
protected void notifyPaymentResult(String orderId, boolean success) {
System.out.println("默认通知方式 - 订单:" + orderId
+ " 支付" + (success ? "成功" : "失败"));
}
}
// 支付宝支付实现
public class AlipayProcessor extends PaymentProcessor {
@Override
protected boolean callPaymentGateway(double amount, String orderId) {
System.out.println("调用支付宝网关 - 订单:" + orderId + ", 金额:" + amount);
// 模拟支付成功
return true;
}
@Override
protected void notifyPaymentResult(String orderId, boolean success) {
// 支付宝特有的通知方式
System.out.println("通过支付宝消息服务通知 - 订单:" + orderId
+ " 支付" + (success ? "成功" : "失败"));
}
}
// 微信支付实现
public class WechatPayProcessor extends PaymentProcessor {
@Override
protected boolean callPaymentGateway(double amount, String orderId) {
System.out.println("调用微信支付网关 - 订单:" + orderId + ", 金额:" + amount);
// 模拟支付成功
return true;
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
PaymentProcessor alipay = new AlipayProcessor();
alipay.processPayment(100.0, "ORDER_123");
System.out.println("------------------");
PaymentProcessor wechatPay = new WechatPayProcessor();
wechatPay.processPayment(200.0, "ORDER_456");
}
}
模板模式的核心意图是定义算法骨架,允许子类重定义特定步骤而不改变结构。在保持架构稳定的同时提供了足够的灵活性,是框架设计中常用的核心模式。