模板方法模式 又称 模板模式(Template Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类重写特定步骤的方法,而不改变算法的整体结构。
在模板模式中,定义了一个抽象类,该抽象类包含了算法的框架,其中的某些步骤由抽象方法或默认实现提供。具体步骤的实现延迟到子类中。这样,子类可以根据需要重写父类的方法,同时保留算法的整体结构。模板模式主要包含以下关键组件:
模板模式使得整体算法的结构固定,但其中的某些步骤可以由子类进行定制,从而避免了代码重复和增加灵活性,使得代码更易于维护和扩展。
import java.util.Map;
public abstract class BusinessProcessTemplate {
public final Map<String, String> process(Map<String, String> paramsMap) {
// 检查参数
Map<String, String> validateResult = validate(paramsMap);
String code = validateResult.getOrDefault("code", "0000");
System.out.println("校验参数返回:"+validateResult);
if (!"0000".equals(code)) {
return validateResult;
}
// 执行业务
Map<String, String> resultMap = execute(paramsMap);
System.out.println("业务处理返回结果:"+resultMap);
// 省略其他操作及其异常处理
// 返回结果
return resultMap;
}
public abstract Map<String, String> validate(Map<String, String> paramsMap);
public abstract Map<String, String> execute(Map<String, String> paramsMap);
}
import java.util.HashMap;
import java.util.Map;
public class RefundApplyService extends BusinessProcessTemplate {
@Override
public Map<String, String> validate(Map<String, String> paramsMap) {
System.out.println("-------------------------退款申请---------------------");
System.out.println("退款申请参数:" + paramsMap);
Map<String, String> validateResult = new HashMap<>();
validateResult.put("code", "1000");
int amount = Integer.parseInt(paramsMap.getOrDefault("amount", "0"));
if (amount <= 0) {
validateResult.put("msg", "退款金额必须大于0元");
return validateResult;
}
// 其他参数校验等...
validateResult.put("code", "0000");
validateResult.put("msg", "参数验证通过");
return validateResult;
}
@Override
public Map<String, String> execute(Map<String, String> paramsMap) {
Map<String, String> resultMap = new HashMap<>();
// 执行业务判断
// 退款申请等
resultMap.put("code", "0000");
resultMap.put("msg", "success");
return resultMap;
}
}
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
public class TransferApplyService extends BusinessProcessTemplate{
@Override
public Map<String, String> validate(Map<String, String> paramsMap) {
System.out.println("------------------------转账申请----------------------");
System.out.println("转账申请参数:"+paramsMap);
Map<String, String> validateResult = new HashMap<>();
validateResult.put("code", "1000");
String account = paramsMap.getOrDefault("account", "0");
int amount = Integer.parseInt(paramsMap.getOrDefault("amount", "0"));
if (StringUtils.isNotBlank(account)) {
validateResult.put("msg", "账户不能为空");
return validateResult;
}
if (amount <= 0 || amount>200) {
validateResult.put("msg", "转账金额必须大于0元,小于等于200元");
return validateResult;
}
// 其他参数校验等...
validateResult.put("code", "0000");
validateResult.put("msg", "参数验证通过");
return validateResult;
}
@Override
public Map<String, String> execute(Map<String, String> paramsMap) {
Map<String, String> resultMap = new HashMap<>();
// 执行业务判断
// 转账申请等
resultMap.put("code", "0000");
resultMap.put("msg", "success");
return resultMap;
}
}
import java.util.HashMap;
import java.util.Map;
public class TemplatePatternExample {
public static void main(String[] args) {
// 退款申请
Map<String, String> refundParamsMap = new HashMap<>();
refundParamsMap.put("amount", "100");
BusinessProcessTemplate refundProcess = new RefundApplyService();
refundProcess.process(refundParamsMap);
// 转账申请
Map<String, String> transferParamsMap = new HashMap<>();
transferParamsMap.put("amount", "300");
BusinessProcessTemplate transferProcess = new TransferApplyService();
transferProcess.process(transferParamsMap);
}
}
模板方法模式(Template Method Pattern)的优点和缺点如下所示:
优点
缺点
总的来说,模板方法模式能够提高代码的复用性、提高系统的扩展性和可维护性,但需要注意子类的依赖性和不适用于所有的场景。选择使用模板方法模式时,需要根据具体的情况来评估其优缺点,以确保模式的适用性。