模版模式 设计模式
设计模式 总目录
https://preparedata.blog.csdn.net/article/details/134512591
文章目录
- 设计模式 总目录
- 一、案例
- 二、抽象类模版 AbstractOrderTemplate(顶层的订单抽象类)
- 三、执行模版的实现类
- 3.1 默认执行模版 DefaultOrder
- 3.2 其他执行模版 SimlpeOrder
- 四、调用
一、案例
在的下单业务中,可以将下单逻辑拆分,可能存在检验参数、获取商品、 扣减库存、核销优惠券、抵扣积分,保存订单等等。
应为业务的不同,可能下单处理节点不同(扣减库存、核销优惠券、抵扣积分,可能需要,可能不需要,也可能相互组合)。这是我们在单一下单接口中,逻辑就比较复杂,需要各种判断,各种兼容,后续代码逻辑很难清晰
这是我们可以借助模版模式,将下单逻辑,各个节点拆分,将具体各节点的执行进行模版组合,一个模版对应一套逻辑, 具体的下单逻辑,派发给模版去执行。
1.定义 抽象类 AbstractOrderTemplate 定义声明拆分下单逻辑, 声明模版执行; 通过业务类型来获取模版;
2.定义 实现类 DefaultOrder (默认的执行模版)、 SimlpeOrder (其他的执行模版)继承AbstractOrderTemplate, 实现抽象类AbstractOrderTemplate的模版执行。
通过模版可以自由区组合业务节点, 打包成一个执行整体。
二、抽象类模版 AbstractOrderTemplate(顶层的订单抽象类)
package com.pd.shopping.order.designptern.template;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.Map;/*** @author hll*/
@Slf4j
@Component
public abstract class AbstractOrderTemplate {public static AbstractOrderTemplate getInstance(String orderType) {switch (orderType){case "Simlpe"://可以利用一些获取Bean的工具获取, 避免new//SpringApplicationUtil.getBean(SimlpeOrder.class);return new SimlpeOrder();case "Default":return new DefaultOrder();default:return new DefaultOrder();}}/*** 检查参数* @param map*/public abstract void check(Map<String, Object> map);/*** 获取商品* @param map*/public abstract void getGoods(Map<String, Object> map);/*** 扣减库存* @param map*/public abstract void deductStock(Map<String,Object> map);/*** 扣减积分* @param map*/public abstract void deductPoint(Map<String,Object> map);/*** 保存订单* @param map*/public abstract void saveOrder(Map<String,Object> map);/*** 执行模版* @param map*/public abstract void executeTemplate(Map<String,Object> map);
}
三、执行模版的实现类
3.1 默认执行模版 DefaultOrder
package com.pd.shopping.order.designptern.template;import java.util.Map;public class DefaultOrder extends AbstractOrderTemplate {@Overridepublic void check(Map<String, Object> map) {}@Overridepublic void getGoods(Map<String, Object> map) {}@Overridepublic void deductStock(Map<String, Object> map) {}@Overridepublic void deductPoint(Map<String, Object> map) {}@Overridepublic void saveOrder(Map<String, Object> map) {}@Overridepublic void executeTemplate(Map<String, Object> map) {//检查参数check(map);//获取商品getGoods(map);//扣减库存deductStock(map);//扣减积分deductPoint(map);//保存订单saveOrder(map);}
}
3.2 其他执行模版 SimlpeOrder
package com.pd.shopping.order.designptern.template;import java.util.Map;public class SimlpeOrder extends AbstractOrderTemplate {@Overridepublic void check(Map<String, Object> map) {}@Overridepublic void getGoods(Map<String, Object> map) {}@Overridepublic void deductStock(Map<String, Object> map) {}@Overridepublic void deductPoint(Map<String, Object> map) {}@Overridepublic void saveOrder(Map<String, Object> map) {}@Overridepublic void executeTemplate(Map<String, Object> map) {//检查参数check(map);//获取商品getGoods(map);//保存订单saveOrder(map);}
}
四、调用
@GetMapping("/templateOrder")public void templateOrder() {AbstractOrderTemplate.getInstance("Simlpe").executeTemplate(new HashMap<>());AbstractOrderTemplate.getInstance("Default").executeTemplate(new HashMap<>());}
相关文章:
模版模式 设计模式
设计模式 总目录 https://preparedata.blog.csdn.net/article/details/134512591 文章目录 设计模式 总目录一、案例二、抽象类模版 AbstractOrderTemplate(顶层的订单抽象类)三、执行模版的实现类3.1 默认执行模版 DefaultOrder3.2 其他执行模版 Simlp…...
MySQL锁机制
前置 锁理论 锁总结 锁实践 记录锁 间隙锁 临键锁 对数据库的操作有读、写,组合起来就有 读读、读写、写读、写写,读读不存在安全问题,安全问题加锁都可以解决,但所有的操作都加锁太重了,只有写写必须要求加锁&…...
webpack loader
1、分类 2、执行顺序 配置类型 执行顺序是 loader1>loader2>loader3 3、使用方式 自己的第一个loader 同步loader /*** loader 就是一个函数* 当webpack 解释资源时, 会调用相应的loader去处理* loader 接收到文件内容作为参数,返回文件内容* p…...
Java—学生信息管理系统(简单、详细)
文章目录 一、主界面展示二、学生类三、系统功能方法3.1 main()方法3.2 添加学生信息3.3 删除学生信息3.4 修改学生信息3.5 查看所有学生信息 四、完整代码4.1 Student .Java4.2 StudentManger.Java 前言:本案例在实现时使用了Java语言中的ArrayList集合来储存数据。…...
Spring第一课,了解IDEA里面的文件,回顾Cookie和Session,获取Session,Cookie,Header的方式
目录 IDEA第一课(熟悉里面内容) 建立连接 -RequestMapping 路由映射 请求 1.传递单个参数编辑 2.多个参数编辑 3.传递数组 4.传递一个集合,但是这里我们传递的时候发生了500的错误 简单介绍JSON 回顾Cookie和S…...
AcWing113.特殊排序
题目 有 N N N 个元素,编号 1 , 2.. N 1,2..N 1,2..N,每一对元素之间的大小关系是确定的,关系具有反对称性,但不具有传递性。 注意:不存在两个元素大小相等的情况。 也就是说,元素的大小关系是 N N N…...
数据仓库岗面试
1.自我介绍 2.求用户连续登录3天,要讲出多种解法 解法1(使用SQL): SELECTuserid FROMloginrecord WHEREDATEDIFF(day, time, LAG(time) OVER (PARTITION BY userid ORDER BY time)) 1AND DATEDIFF(day, LAG(time) OVER (PARTI…...
企业建数仓的第一步是选择一个好用的ETL工具
当企业决定建立数据仓库(Data Warehouse),第一步就是选择一款优秀的ETL(Extract, Transform, Load)工具。数据仓库是企业数据管理的核心,它存储、整合并管理各种数据,为商业决策和数据分析提供支…...
行情分析 - - 加密货币市场大盘走势(11.23)
大饼昨日又开始了回调,因为FTF消息,而实际还是要下跌的,耐心等待即可。 空单策略:入场37300 止盈34000-33000 止损39000 以太昨日上涨也很激励,目前上涨打了止损,现在入场是好的机会,等待即可。…...
穿山甲SDK 集成·android接入广告·app流量变现
接入穿山甲SDK的app 数独训练APP 广告接入示例: Android 个人开发者如何接入广告SDK,实现app流量变现 接入穿山甲SDK app示例: android 数独小游戏 经典数独休闲益智 随着移动互联网的快速发展,广告成为了许多应用开发者获取收益的主要方…...
深度学习模型训练计算量的估算
深度学习模型训练计算量的估算 方法1:基于网络架构和批处理数量计算算术运算次数前向传递计算和常见层的参数数量全连接层(Fully connected layer)参数浮点数计算量 CNN参数浮点数计算量 转置CNN参数浮点数计算量 RNN参数浮点数计算量 GRU参数…...
【实验笔记】C语言实验——降价提醒机器人
降价提醒机器人 题目: 小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。 输入格式…...
YOLOv5分割训练,从数据集标注到训练一条龙解决
最近进行了分割标注,感觉非常好玩,也遇到了很多坑,来跟大家分享一下,老样子有问题评论区留言,我会的就会回答你。 第一步:准备数据集 1、安装标注软件labelme如果要在计算机视觉领域深入的同学࿰…...
再添千万级罚单,某银行年内罚款过亿!金融行业合规问题亟待解决
11月17日晚间,国家金融监管总局上海监管局披露行政处罚信息显示,某银行因32项违法违规事实收到两张690万元的大额罚单,合计罚款金额达1380万元。但这并不是银行该今年收到的第一张大额罚单。今年4月28日,该行因在结售汇、外币理财…...
配置Nginx服务器用于Web应用代理和SSL{仅配置文件}
在本篇博文中,我们将深入讨论如何配置Nginx服务器,使其成为一个强大的Web应用代理,并通过SSL协议加强通信的安全性。 1. 服务器监听与SSL设置 首先,我们要配置Nginx服务器以监听HTTPS流量并设置SSL证书,确保通信的安…...
【广州华锐互动】VR溺水预防教育:在虚拟世界中学会自救!
在现代社会中,水上安全和救援行动的重要性不言而喻。尤其在自然灾害、游泳事故或航海事故中,有效的救援行动可以挽救许多生命。然而,传统的救援训练往往存在成本高、风险大、效率低等问题。在这样的背景下,虚拟现实(VR…...
Si(111)衬底上脉冲激光沉积AlN外延薄膜的界面反应控制及其机理
引言 通过有效控制AlN薄膜与Si衬底之间的界面反应,利用脉冲激光沉积(PLD)在Si衬底上生长高质量的AlN外延薄膜。英思特对PLD生长的AlN/Si异质界面的表面形貌、晶体质量和界面性能进行了系统研究。 我们研究发现,高温生长过程中形…...
基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管
一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构,该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标,Tiva™C系列架构提供了一个具有FPU的80…...
苹果企业签名失败常见的问题
苹果企业签名失败的常见问题主要有以下几种: 证书过期或无效:苹果开发者需要定期更新他们的签名证书,以确保其有效性。一旦证书过期,相关应用将无法正常工作。证书不匹配:如果使用的证书与应用程序的Bundle ID不匹配&…...
Jtti:Android alertdialog嵌套出错怎么解决
在Android开发中,AlertDialog嵌套可能导致一些问题,例如显示异常或无法关闭对话框等。这通常是由于上一个AlertDialog未被正确关闭,导致下一个AlertDialog无法正常工作。解决这个问题的方法包括: 1. 确保关闭上一个AlertDialog&a…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
