怎么使用web设计模式中的模板方法
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,本篇内容介绍了"怎么使用web设计模式中的模板方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么
千家信息网最后更新 2025年02月03日怎么使用web设计模式中的模板方法
本篇内容介绍了"怎么使用web设计模式中的模板方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
什么是模版方法模式
模板方法模式
1.定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2.模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。 因此,在模板方法模式的类结构图中,只有继承关系。
核心设计要点
AbstractClass : 抽象类,定义并实现一个模板方法。这个模板方法定义了算法的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类去实现ConcreteClass : 实现实现父类所定义的一个或多个抽象方法。
模版方法应用场景
比如聚合支付平台中系统回调代码重构
Servlet请求
模板方法的代码实现
模板方法抽象类
@Slf4j@Componentpublic abstract class AbstractPayCallbackTemplate { /** * 异步回调业务 * * @return */ public String asyncCallBack() { // 1. 支付回调验证参数 MapverifySignatureMap = 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 MapverifySignature() { //>>>>假设一下为支付宝回调报文>>>>>>>>>>>>>>>> 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 MapverifySignature() { //>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>> 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安全错误
数据库的锁怎样保障安全
网络安全二级等保要求
GUI客户端软件开发
浪潮服务器管理ip如何设置
麦格服务器
云服务器要考虑安全问题吗
数据库中的数据智能
吉林正规软件开发销售厂家
access数据库 使用
全世界最大数据库公司
软件开发吃什么配置
计算机网络安全主要指什么
山石网络安全行业
金字塔读写数据库
服务器管理区如何配置
E6管理系统服务器
人文科学引文数据库
狮山软件开发培训
网络安全动漫版
软件开发管理缩写
小茵开我的世界服务器
深圳市恒游网络技术
微信服务号要服务器吗
计算机网络技术课综报告
服务器端的开发技术
软件开发企业如何核算成本
公司网络安全准入控制系统
你的世界服务器下载
哈利波特服务器密室
数据库用哪个关键字查询数据
北京服务器机柜厂家排名