1、什么是模板方法模式
定义了一个操作中的算法骨架,而将部分步骤的实现在子类完成。是最常见的设计模式,是基于继承的代码复用的技术,因此在模板方法类模型中只有继承关系。
2、模板方法模式类结构图
AbstractClass:抽象类,定义并实现一个模板方法,这个模板方法定义了算法的骨架,而抽象的逻辑步骤在相应的抽象操作中,推迟到子类去实现。
ConcreteClass:实现父类定义的一个或多个抽象方法。
3、优点:
通过把不变的行为放到超类,去除了子类中的重复代码。子类实现算法中的某些细节,有助于算法扩展,通过子类来增加新的行为,符合开闭原则。
缺点:
每个不同的实现都需要定义一个子类,这样会导致类的个数增加,设计更加抽象。
4、模板方法模式应用场景
比如聚合支付平台中系统回调代码的重构
模板方法抽象类
@Slf4j@Componentpublic abstract class AbstractPayCallbackTemplate {/*** 异步回调业务** @return*/public String asyncCallBack() {// 1. 支付回调验证参数Map<String, String> verifySignatureMap = verifySignature();// 2. 参数验证成功,写入日志中..payLog(verifySignatureMap);String analysisCode = verifySignatureMap.get("analysisCode");if (!analysisCode.equals("200")) {return resultFail();}// 3. 执行回调异步相关逻辑return asyncService(verifySignatureMap);}/*** 支付回调验证参数** @return*/protected abstract Map<String, String> verifySignature();/*** 使用多线程异步写入日志** @param verifySignatureMap*/@Asyncprivate void payLog(Map<String, String> verifySignatureMap) {log.info(">>>>>>>>>>第二步 写入payLog........");}/*** 每个子类需要实现 实现业务解析操作** @return*/protected abstract String asyncService(Map<String, String> verifySignatureMap);/*** 异步返回结果..** @return*/protected abstract String resultSuccess();/*** 异步返回失败** @return*/protected abstract String resultFail();}
具体实现:
@Component@Slf4jpublic class AliPayCallbackTemplate extends AbstractPayCallbackTemplate {@Overrideprotected Map<String, String> verifySignature() {//>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>>log.info(">>>>>第一步 解析支付宝据报文.....verifySignature()");Map<String, String> verifySignature = new HashMap<>();verifySignature.put("price", "1399");verifySignature.put("orderDes", "充值蚂蚁课堂永久会员");// 支付状态为1表示为成功....verifySignature.put("aliPayMentStatus", "1");verifySignature.put("aliPayOrderNumber", "201910101011");// 解析报文是否成功 200 为成功..verifySignature.put("analysisCode", "200");return verifySignature;}@Overrideprotected String asyncService(Map<String, String> verifySignatureMap) {log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap);String paymentStatus = verifySignatureMap.get("aliPayMentStatus");if (paymentStatus.equals("1")) {String aliPayOrderNumber = verifySignatureMap.get("aliPayOrderNumber");log.info(">>>>orderNumber:{aliPayOrderNumber},已经支付成功 修改订单状态为已经支付...");}return resultSuccess();}@Overrideprotected String resultSuccess() {return "ok";}}
@Component@Slf4jpublic class UnionPayCallbackTemplate extends AbstractPayCallbackTemplate {@Overrideprotected Map<String, String> verifySignature() {//>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>>log.info(">>>>>第一步 解析银联数据报文.....verifySignature()");Map<String, String> verifySignature = new HashMap<>();verifySignature.put("price", "1399");verifySignature.put("orderDes", "充值蚂蚁课堂永久会员");// 支付状态为1表示为成功....verifySignature.put("paymentStatus", "1");verifySignature.put("orderNumber", "201910101011");// 解析报文是否成功 200 为成功..verifySignature.put("analysisCode", "200");return verifySignature;}@Overrideprotected String asyncService(Map<String, String> verifySignatureMap) {log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap);String paymentStatus = verifySignatureMap.get("paymentStatus");if (paymentStatus.equals("1")) {String orderNumber = verifySignatureMap.get("orderNumber");log.info(">>>>orderNumber:{orderNumber},已经支付成功 修改订单状态为已经支付...");}return resultSuccess();}@Overrideprotected String resultSuccess() {return "success";}}
工厂模式获取模板
public class TemplateFactory {public static AbstractPayCallbackTemplate getPayCallbackTemplate(String templateId) {AbstractPayCallbackTemplate payCallbackTemplate = (AbstractPayCallbackTemplate) SpringUtils.getBean(templateId);return payCallbackTemplate;}}
如何调用:
@RestControllerpublic class TemplateController {@RequestMapping("/asyncCallBack")public String asyncCallBack(String templateId) {AbstractPayCallbackTemplate payCallbackTemplate = TemplateFactory.getPayCallbackTemplate(templateId);return payCallbackTemplate.asyncCallBack();}}
