设计模式之策略模式(一)
背景:
下单时有很多情况,有的是用户下单,有的是卡密下单,有的是下游下单,有的是需要唤起支付,有的不需要支付,这样就需要写很多下单接口,下面使用策略模式优化这种情况
代码结构
com.example.order
├── controller
│ └── OrderController.java
├── service
│ ├── OrderService.java
│ └── impl
│ └── OrderServiceImpl.java
├── strategy
│ ├── OrderStrategy.java
│ ├── factory
│ │ └── OrderStrategyFactory.java
│ ├── impl
│ │ ├── UserOrderStrategy.java
│ │ └── CardOrderStrategy.java
├── dto
│ └── OrderDTO.java
├── vo
│ ├── UserOrderVO.java
│ └── CardOrderVO.java
├── mapper
│ ├── OrderMapper.java
│ └── xml
│ └── OrderMapper.xml
├── domain
│ └── OrderDO.java
@RestController
@RequestMapping("/orders")
public class OrderController {@Autowiredprivate OrderService orderService;@PostMapping("/create")public ResponseEntity<?> createOrder(@RequestBody OrderDTO orderDTO) {Object orderVO = orderService.createOrder(orderDTO);return new ResponseEntity<>(orderVO, HttpStatus.OK);}
}
@Service
public class OrderServiceImpl implements OrderService {@Override@SuppressWarnings("unchecked")public <T> T createOrder(OrderDTO orderDTO) {OrderStrategy<T> strategy = OrderStrategyFactory.getStrategy(orderDTO.getOrderType());return strategy.createOrder(orderDTO);}
}
策略类接口
public interface OrderStrategy<T> {T createOrder(OrderDTO orderDTO);
}
用户下单策略类
public class UserOrderStrategy implements OrderStrategy<UserOrderVO> {@Overridepublic UserOrderVO createOrder(OrderDTO orderDTO) {// 用户下单的具体处理逻辑// 生成订单并保存到数据库// 返回UserOrderVO对象UserOrderVO userOrderVO = new UserOrderVO();// 设置相关属性return userOrderVO;}
}
卡密下单策略类
public class CardOrderStrategy implements OrderStrategy<CardOrderVO> {@Overridepublic CardOrderVO createOrder(OrderDTO orderDTO) {// 卡密下单的具体处理逻辑// 生成订单并保存到数据库// 返回CardOrderVO对象CardOrderVO cardOrderVO = new CardOrderVO();// 设置相关属性return cardOrderVO;}
}
策略类工厂
import java.util.HashMap;
import java.util.Map;public class OrderStrategyFactory {private static final Map<String, OrderStrategy<?>> strategies = new HashMap<>();static {strategies.put("USER_ORDER", new UserOrderStrategy());strategies.put("CARD_ORDER", new CardOrderStrategy());// 初始化其他订单类型的策略}@SuppressWarnings("unchecked")public static <T> OrderStrategy<T> getStrategy(String orderType) {OrderStrategy<?> strategy = strategies.get(orderType);if (strategy == null) {throw new IllegalArgumentException("Unknown order type: " + orderType);}return (OrderStrategy<T>) strategy;}
}
public class UserOrderVO {private String orderId;private String status;private String userSpecificInfo;// 其他用户订单特有属性// Getters and Setters
}public class CardOrderVO {private String orderId;private String status;private String cardCode;// 其他卡密订单特有属性// Getters and Setters
}
public interface OrderMapper {void insertOrder(OrderDO orderDO);// 其他数据库操作方法
}
<mapper namespace="com.example.mapper.OrderMapper"><insert id="insertOrder" parameterType="OrderDO">INSERT INTO orders (order_id, user_id, order_type, payment_type, status)VALUES (#{orderId}, #{userId}, #{orderType}, #{paymentType}, #{status})</insert><!-- 其他数据库操作的XML定义 -->
</mapper>
相关文章:
设计模式之策略模式(一)
背景: 下单时有很多情况,有的是用户下单,有的是卡密下单,有的是下游下单,有的是需要唤起支付,有的不需要支付,这样就需要写很多下单接口,下面使用策略模式优化这种情况 代码结构 com.example.order ├── controller │ └── OrderController.java ├── service │ …...
常见网络攻击及解决方案
网络安全是开发中常常会遇到的情况,为什么会遇到网络攻击,网络攻击是如何进行的,如何抵御网络攻击,都是我们需要思考的问题。 为什么会遇到网络攻击? 以下是一些主要的因素: 技术漏洞:软件或操…...
【挑战30天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机
文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1:下载MobaXterm选择适合你的版本 Stage 2:vagrant ssh 连接,开启ssh访问 Stage 2-1:su获取root账号权限,输入密码(默认vagra…...
【C++】每日一题 17 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 可以使用回溯法来解决这个问题。首先定义一个映射关系将数字与字母对应起来…...
vue预览PDF文件的几种方法
1.使用iframe标签预览PDF文件 1.1页面结构 html <iframe:src"fileUrl"id"iframeBox"ref"iframeRef"frameborder"0"style"width: 100%; height: 800px"></iframe>1.2 js代码 export default {data() {return {…...
深度学习入门到放弃系列 - 阿里云人工智能平台PAI部署开源大模型chatglm3
通过深度学习入门到放弃系列 - 魔搭社区完成开源大模型部署调用 ,大概掌握了开源模型的部署调用,但是魔搭社区有一个弊端,关闭实例后数据基本上就丢了,本地的电脑无法满足大模型的配置,就需要去租用一些高性价比的GPU机…...
GPT-4o,AI实时视频通话丝滑如人类,Plus功能免费可用
不开玩笑,电影《她》真的来了。 OpenAI最新旗舰大模型GPT-4o,不仅免费可用,能力更是横跨听、看、说,丝滑流畅毫无延迟,就像在打一个视频电话。 现场直播的效果更是炸裂: 它能感受到你的呼吸节奏…...
【优选算法】——Leetcode——202—— 快乐数
目录 1.题目 2. 题⽬分析: 3.简单证明: 4. 解法(快慢指针): 算法思路: 补充知识:如何求⼀个数n每个位置上的数字的平⽅和。 总结概括 5.代码实现 1.C语言 2.C 1.题目 202. 快乐数 编写一个算法来…...
华大基因CEPO-尹烨说学习与生活
怎么去面对生活和事业中的不确定性? 尹烨说,人类能够对抗不确定性的唯一的办法是,去让自己充电。 主持人问他,“和你同年的也有很多人,他们也可能也在学习,你怎么就能够脱颖而出呢?” 他说&am…...
C#中json数据序列化和反序列化的最简单方法(C#对象和字符串的相互转换)
文章目录 将C#对象转换为json字符串Newtonsoft模块的安装用Newtonsoft将对象转换为json字符串 将json字符串转换为C#对象 将C#对象转换为json字符串 本介绍将基于C#中的第三方库Newtonsoft进行,因此将分为Newtonsoft模块的安装和使用两部分。该模块的优势在于只需要…...
logback 日志脱敏
工具类 CustomLogbackPatternLayoutEncoder.java import ch.qos.logback.classic.encoder.PatternLayoutEncoder;public class CustomLogbackPatternLayoutEncoder extends PatternLayoutEncoder {/*** 正则替换规则*/private LogbackReplaces replaces;/*** 使用自定义 MyLog…...
element-ui的表单中,输入框、级联选择器的长度设置
使用<el-col>控制输入框的长度 <el-form-item label"姓名" label-width"80px"><el-col :span"15"><el-input v-model"form.name" autocomplete"off"></el-input></el-col></el-form…...
深入了解 npm:Node.js 包管理工具详解
文章目录 一、npm 基本概念1.1 什么是 npm?1.2 package.json 文件 二、npm 常用命令2.1 初始化项目2.2 安装依赖2.2.1 安装单个包2.2.2 全局安装包2.2.3 安装开发依赖 2.3 移除依赖2.4 更新依赖2.5 查看已安装的包2.6 发布包 三、npm 高级用法3.1 使用 npm scripts3…...
记一次跨域问题
线上跨域问题,在自己配置确认没问题下,要及时找运维看看是不是nginx配置问题。 两个方面: 项目代码 nginx配置 SpringBoot 解决跨域问题的 5 种方案! SpringBoot解决CORS跨域问题 SpringBoot-实现CORS跨域原理及解决方案...
第9章 负载均衡集群日常维护
一个设计良好的高可用负载均衡集群,交付使用以后并不能一劳永逸。欲使其高效、稳定、持续对外服务,日常维护必不可少。 对于高可用负载均衡集群来说,有两种类型的维护形式:常规性维护与突发性维护。突发性维护一般指故障处理&…...
鸿蒙内核源码分析(消息封装篇) | 剖析LiteIpc(上)进程通讯内容
基本概念 LiteIPC是OpenHarmony LiteOS-A内核提供的一种新型IPC(Inter-Process Communication,即进程间通信)机制,为轻量级进程间通信组件,为面向服务的系统服务框架提供进程间通信能力,分为内核实现和用户…...
Charger之三动态电源路径管理(DPPM)
-----本文简介----- 主要内容包括: 领资料:点下方↓名片关注回复:粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理(DPPM) 前篇内容:①电池管理IC(Charger)了解一下&…...
大数据模型的选择与安装
大数据模型的选择和安装是一个复杂的过程,涉及多个因素,包括模型的通用能力、特定任务的性能、数据效率、评估完整性、成本以及部署的硬件和软件环境。以下是一些关于大数据模型选择与安装的考虑因素和步骤: 选择大数据模型的考虑因素&#…...
React 之 lazy(延迟加载)(十七)
lazy 能够让你在组件第一次被渲染之前延迟加载组件的代码。 在组件外部调用 lazy,以声明一个懒加载的 React 组件: import { lazy } from react;const MarkdownPreview lazy(() > import(./MarkdownPreview.js)); 配合 Suspense 实现懒加载组件 //App.js imp…...
Node.js -- 会话控制
文章目录 1. 会话介绍2. cookie 相关操作2.1 cookie 设置2.2 删除 cookie2.3 获取cookie 3. session 相关操作4. cookie 和session 的区别5. 补充知识 -- CSRF跨站请求伪造6. token 1. 会话介绍 所谓会话控制就是对会话进行控制 HTTP是一种无状态的协议,它没有办法…...
3个技巧让Sketch设计稿命名效率提升300%:Rename It插件终极指南
3个技巧让Sketch设计稿命名效率提升300%:Rename It插件终极指南 【免费下载链接】RenameIt Keep your Sketch files organized, batch rename layers and artboards. 项目地址: https://gitcode.com/gh_mirrors/re/RenameIt 想象一下这个场景:你刚…...
终极指南:使用SMU Debug Tool释放AMD Ryzen处理器的隐藏性能
终极指南:使用SMU Debug Tool释放AMD Ryzen处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...
新手入门网络安全:用快马AI生成你的第一个密码强度检测器
最近在自学网络安全基础知识,发现密码强度检测是个很好的入门实践。作为新手,我尝试用InsCode(快马)平台的AI辅助功能,快速生成了一个密码强度检测器,整个过程特别适合零基础学习者。这里记录下实现思路和关键要点: 密…...
云服务器是如何保障数据安全的
在云服务器中,访问控制机制是重要的安全屏障。云服务商会实施严格的身份认证,用户需要通过密码、密钥、生物识别等多种方式进行身份验证,只有通过验证的用户才能获得相应的操作权限。同时,基于角色的访问控制将用户分配到不同角色…...
推荐 React 开发需要在 VS Code 中安装的插件
React开发必备VSCode插件清单:核心工具包括ESLintPrettier保障代码质量与风格统一;ES7React代码片段和PathIntellisense提升编码效率;ReactDeveloperTools辅助UI调试。关键配置要点:1)用eslint-config-prettier解决ESLint与Pretti…...
AGV如何选合适的传感器
一、AGV传感器的三大功能块几乎所有AGV都可以把传感器分成三类:1)导航/定位传感器:用来“知道自己在哪、怎么走” 2)本体/运动传感器:用来“知道自己怎么动的” 3)避障/安全传感器:用来“不撞人…...
LAV Filters完整教程:如何让Windows播放器支持所有视频格式
LAV Filters完整教程:如何让Windows播放器支持所有视频格式 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters LAV Filters是一套基于ffmpeg的开源Di…...
10080-基于单片机的智能输液监测系统设计(仿真工程文件+原理图工程+源代码工程+详细介绍说明书)
基于单片机的智能输液监测系统设计(仿真工程文件原理图工程 10080-基于单片机的智能输液监测系统设计(仿真工程文件原理图工程源代码工程详细介绍说明书) 功能描述: (1)设计一个光电传感器,置于一次性输液器的漏斗外边…...
SEO聚合页与传统网页有什么区别
SEO聚合页的核心理念与传统网页的差异 在互联网的世界里,网页的形式和功能不断演变,其中SEO聚合页与传统网页的区别尤为显著。理解这两者的不同,对于提升网站的流量和用户体验至关重要。 SEO聚合页是一种专注于内容聚合和优化的网页形式&am…...
NVIDIA Profile Inspector配置问题全方位解决方案
NVIDIA Profile Inspector配置问题全方位解决方案 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 问题定位:识别配置故障的关键信号 在使用NVIDIA Profile Inspector(一款NVIDI…...
