怎么使用web设计模式中的模板方法
发表于:2025-12-05 作者:千家信息网编辑
千家信息网最后更新 2025年12月05日,本篇内容介绍了"怎么使用web设计模式中的模板方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么
千家信息网最后更新 2025年12月05日怎么使用web设计模式中的模板方法
本篇内容介绍了"怎么使用web设计模式中的模板方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
什么是模版方法模式
模板方法模式
1.定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2.模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。 因此,在模板方法模式的类结构图中,只有继承关系。
核心设计要点
AbstractClass : 抽象类,定义并实现一个模板方法。这个模板方法定义了算法的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类去实现ConcreteClass : 实现实现父类所定义的一个或多个抽象方法。
模版方法应用场景
比如聚合支付平台中系统回调代码重构
Servlet请求
模板方法的代码实现
模板方法抽象类
@Slf4j@Componentpublic abstract class AbstractPayCallbackTemplate { /** * 异步回调业务 * * @return */ public String asyncCallBack() { // 1. 支付回调验证参数 Map verifySignatureMap = verifySignature(); // 2. 参数验证成功,写入日志中.. payLog(verifySignatureMap); String analysisCode = verifySignatureMap.get("analysisCode"); if (!analysisCode.equals("200")) { return resultFail(); } // 3. 执行回调异步相关逻辑 return asyncService(verifySignatureMap); } /** * 支付回调验证参数 * * @return */ protected abstract Map verifySignature(); /** * 使用多线程异步写入日志 * * @param verifySignatureMap */ @Async private void payLog(Map verifySignatureMap) { log.info(">>>>>>>>>>第二步 写入payLog........"); } /** * 每个子类需要实现 实现业务解析操作 * * @return */ protected abstract String asyncService(Map verifySignatureMap); /** * 异步返回结果.. * * @return */ protected abstract String resultSuccess(); /** * 异步返回失败 * * @return */ protected abstract String resultFail();} 具体实现模板
AliPayCallbackTemplate
@Slf4j@Componentpublic class AliPayCallbackTemplate extends AbstractPayCallbackTemplate { @Override protected Map verifySignature() { //>>>>假设一下为支付宝回调报文>>>>>>>>>>>>>>>> log.info(">>>>>第一步 解析支付宝据报文.....verifySignature()"); Map 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; } @Override protected String asyncService(Map 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(); } @Override protected String resultSuccess() { return "ok"; } @Override protected String resultFail() { return null; } UnionPayCallbackTemplate
@Slf4j@Componentpublic class UnionPayCallbackTemplate extends AbstractPayCallbackTemplate { @Override protected Map verifySignature() { //>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>> log.info(">>>>>第一步 解析银联数据报文.....verifySignature()"); Map 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; } @Override protected String asyncService(Map 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(); } @Override protected String resultSuccess() { return "success"; } @Override protected String resultFail() { return null; }} 工厂模式获取模板
@Componentpublic class TemplateFactory { public static AbstractPayCallbackTemplate getPayCallbackTemplate(String templateId) { AbstractPayCallbackTemplate payCallbackTemplate = (AbstractPayCallbackTemplate) SpringUtils.getBean(templateId); return payCallbackTemplate; }}controller
@RestControllerpublic class TemplateController { @RequestMapping("/asyncCallBack") public String asyncCallBack(String templateId) { AbstractPayCallbackTemplate payCallbackTemplate = TemplateFactory.getPayCallbackTemplate(templateId); return payCallbackTemplate.asyncCallBack(); }}控制台输出结果
>>>>>第一步 解析支付宝据报文.....verifySignature()>>>>>>>>>>第二步 写入payLog........>>>>>第三步asyncService()verifySignatureMap:{aliPayOrderNumber=201910101011, orderDes=充值蚂蚁课堂永久会员, price=1399, analysisCode=200, aliPayMentStatus=1}>>>>orderNumber:{aliPayOrderNumber},已经支付成功 修改订单状态为已经支付...1.)优点模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。子类实现算法的某些细节,有助于算法的扩展。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合"开放-封闭原则"。2.)缺点每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。3.)适用场景在某些类的算法中,用了相同的方法,造成代码的重复。控制子类扩展,子类必须遵守算法规则。
"怎么使用web设计模式中的模板方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
方法
支付
模板
模式
子类
成功
算法
报文
代码
状态
设计
会员
参数
步骤
蚂蚁
订单
课堂
永久
验证
设计模式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
剑网三如何加载数据库
小学生网络安全小贴士20字
软件开发需求平台网址
延庆区环保软件开发规定
服务器存储有哪些故障
网络安全解释什么
c 查找数据库及打印的语句
酸性设计软件开发
学软件开发的职高学校哪家好
先学java还是大数据库
网络安全意识 全民
网络办公与网络安全公文
如何学习网络技术支持
安装MySQL 服务器名字已被使用
怎么安装数据库
网络安全的内容都有哪些
方舟生存进化新服务器
随申办服务器炸了
网络安全知识答题平台
软件开发有限公司英语
garena服务器招聘
psv无法在限定时间内连接服务器或设备
oracle 服务器时间
服务器集群怎么搭建
数据库有哪些类
c c 软件开发面试
如何入侵服务器
原神服务器互通的吗
服务器性能压力测试
永诚 网络安全保险