设计模式之策略模式(一)

背景:

下单时有很多情况,有的是用户下单,有的是卡密下单,有的是下游下单,有的是需要唤起支付,有的不需要支付,这样就需要写很多下单接口,下面使用策略模式优化这种情况

代码结构

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用frp通过SSH访问内网机器

frp是一个开源的内网穿透反向代理工具&#xff0c;支持传输层的tcp/udp协议&#xff0c;也支持应用层的http/https协议。 服务端 服务端下载安装 在有公网地址的机器上下载并解压。 wget -c https://github.com/fatedier/frp/releases/download/v0.58.0/frp_0.58.0_linux_a…

odoo16 银行对账单导入改造

解决问题: odoo原生功能的话 是不能在系统上临时处理文件内容的&#xff0c;只会提示文件内容格式不对。 原始文件格式 在头部与尾部 格式问题&#xff0c;例如csv文件和 C53 文件&#xff0c;做一个前置弹框处理数据之后再导入 camt效果: csv效果:

汇聚荣电商:拼多多开店需要多少费用?

想要在拼多多这个巨大的电商平台上开一家属于自己的店铺&#xff0c;很多创业者都会关心一个问题&#xff1a;开店需要多少费用?答案并不复杂&#xff0c;但背后的经营哲学和策略却值得深究。接下来&#xff0c;让我们从四个不同的方面来详细探讨这个问题。 一、开店成本分析 …

通过vue2来类比学习vue3

需求&#xff1a;之前有vue2基础&#xff0c;需要学习使用vue3&#xff1b;当然小白也可以&#xff08;建议先学习vue2&#xff09; 思路&#xff1a;如果已经学习完vue2&#xff0c;那么vue3直接就是小case 一、vue3页面结构&#xff08;归纳为三种&#xff09; 1.传统的vu…

GPT-4o,AI实时视频通话丝滑如人类,Plus功能免费可用

不开玩笑&#xff0c;电影《她》真的来了。 OpenAI最新旗舰大模型GPT-4o&#xff0c;不仅免费可用&#xff0c;能力更是横跨听、看、说&#xff0c;丝滑流畅毫无延迟&#xff0c;就像在打一个视频电话。 现场直播的效果更是炸裂&#xff1a; 它能感受到你的呼吸节奏&#xf…

10G UDP协议栈 IP层设计-(6)IP TX模块

一、模块功能 1、上层数据封装IP报文头部 2、计算首部校验和 二、首部校验和计算方法 在发送方&#xff0c;先把IP数据报首部划分为许多16位字的序列&#xff0c;并把检验和字段置零。用反码算术运算把所有16位字相加后&#xff0c;将得到的和的反码写入检验和字段。接收方收…

C++(week2):C语言中高级

文章目录 (八) 指针0.概念1.指针基础(1)指针的声明(2)指针的两个基本操作①取地址运算符 &②解引用运算符 * (3)野指针①野指针②空指针③指针变量的赋值 vs 指针变量指向对象的赋值 (4)指针的应用①指针作为参数进行传递②指针作为返回值③拓展&#xff1a;栈帧 (5)常量指…

【面试干货】HTTPS 工作原理

【面试干货】HTTPS 工作原理 1、握手阶段&#xff08;Handshake&#xff09;2、密钥协商阶段3、加密通信阶段4、结束通信阶段 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff…

C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能

文章目录 前言一、注意二、源码1. test.c源文件2. contact.h头文件3. contact.c源文件 总结 前言 C语言实现通讯录&#xff0c;包括增删改查以及动态开辟内存&#xff0c;写入文件等功能 一、注意 在通讯录菜单栏使用枚举定义PeoInfo类型时&#xff0c;每个结构体类型的成员…

Java保证字符串唯一(不唯一加数字后缀)

在Java中&#xff0c;如果你有一个字符串列表&#xff0c;并希望确保每个字符串都是唯一的&#xff0c;那么可以通过检查重复项并为重复的字符串添加后缀数字来实现。下面是一个示例代码&#xff0c;展示了如何操作字符串以确保不重复&#xff1a; import java.util.;public cl…

手撸XXL-JOB(一)——定时任务的执行

SpringBoot执行定时任务 对于定时任务的执行&#xff0c;SpringBoot提供了三种创建方式&#xff1a; 1&#xff09;基于注解(Scheduled) 2&#xff09;基于接口&#xff08;SchedulingConfigurer&#xff09; 3&#xff09;基于注解设定多线程定时任务 基于Scheduled注解 首…

基于51单片机的冰箱控制系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机冰箱控制系统设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 基于51单片机冰箱控制系统设计 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接资料下载链接&#xff1a; …

【C++】学习笔记——继承_2

文章目录 十二、继承5. 继承与友元6. 继承与静态成员7. 复杂的菱形继承及菱形虚拟继承 未完待续 十二、继承 5. 继承与友元 友元关系不能继承&#xff0c;也就是说父类友元不能访问子类私有和保护成员 。除非子类也设置成友元。 6. 继承与静态成员 父类定义了 static 静态成…

pnpm:无法加载文件 C:\Users\PC\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。

使用pnpm命令启动vue时报了个错&#xff1a; 解决起来也简单&#xff0c;右击开始菜单&#xff0c;用管理员身份打开终端。win11的如下图&#xff1a; win10我记得应该是PowerShell&#xff08;管理员&#xff09;&#xff0c;这样的。 打开之后执行命令&#xff1a; set-…

HOW - 如何封装一个规范的请求

封装一个规范的请求通常涉及到以下几个方面: 请求方法(GET、POST 等)请求参数构造(根据使用的请求库,包括不同 Method 要求的 params 格式、空值处理等)格式转换(如请求体和返回体参数的下划线格式和驼峰格式转换,一般前端会用驼峰命名格式,后台会用下划线命名格式)请…

物联网平台之单体架构

介绍本文主要介绍平台的单体架构&#xff0c;包括各个组件之间的数据流描述以及所做的一些架构选择。在单体架构模式下&#xff0c;所有 ThingsKit 组件都在单个 Java 虚拟机 (JVM) 中启动&#xff0c;并共享相同的操作系统资源。由于 ThingsKit 是用 Java 编写的&#xff0c;因…

蓝队面试题(二)

应急响应基本思路和流程 收集信息:收集客户信息和中毒主机信息,包括样本 判断类型:判断是否是安全事件,何种安全事件,勒索、挖矿、断网、DoS 等等 抑制范围:隔离使受害⾯不继续扩⼤ 深入分析:日志分析、进程分析、启动项分析、样本分析方便后期溯源 清理处置:杀掉…

在Windows环境下的rknn-toolkit环境搭建

在Windows环境下的rknn-toolkit环境搭建 最近需要使用RK3566来跑YOLOv5。想要实现目标就需要使用rknn-toolkit工具将模型转化成可以运行在rk3588的NPU上的模型。只是转换模型的话&#xff0c;没有必要使用GPU&#xff0c;所以我这里安装的是CPU版的&#xff0c;所需的组件按照…

dnf手游攻略,新手入坑必备!

一、角色创建策略 在DNF手游中&#xff0c;角色创建是玩家初入游戏的首要步骤。为最大化游戏体验和收益&#xff0c;新手玩家通常建议创建三个角色&#xff1a;一个主账号和两个副账号。 主账号选择 主账号的选择应基于玩家个人的喜好和对职业的熟悉程度。无论选择哪个职业&a…

番外篇 | 手把手教你利用YOLOv8进行热力图可视化 | 针对视频

前言:Hello大家好,我是小哥谈。YOLOv8的热力图可视化可以帮助我们更加直观地了解模型在图像中的检测情况,同时也可以帮助我们进行模型的调试和优化。热力图是一种颜色渐变的图像,不同颜色的区域表示不同程度的关注度或者置信度。在YOLOv8中,可以通过设置阈值来控制热力图的…