策略模式实战

项目推荐

最近开发完成的项目中使用到了策略模式,实现多种支付方式,避免了后期支付方式if-else代码的冗余,也有利于后期支付的一个扩展。同时这个项目非常适合于做毕设,想了解这个项目的同学可以联系我QQ:3808898981

前台首页

前台首页

后台管理员

后台管理员端

后台商户端

商户管理端

什么是策略模式呢?

策略模式(Strategy Design Pattern),定义一堆算法类,并将每个算法分别封装起来,让它们可以互相替换,被封装起来的算法具有独立性外部不可改变其特性。

策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

策略模式的应用场景 策略模式最常见的应用场景是,利用它来避免冗长的 if-else 或 switch 分支判断。不过,它的作用还不止如此。它也可以像模板模式那样,提供框架的扩展点等等。

当我们需要多个功能相似的类,并且需要它们之间可以灵活切换时,就非常适合使用策略模式。

策略模式的构成 策略类的定义比较简单,需要定义以下两种角色:

  • 抽象策略接口类:定义了策略类需要实现的方法规范。

  • 策略实现类:继承自抽象策略接口,为具体策略类。

  • 当有多个策略时,可以通过简单工厂封装所有的策略,使调用更加易用:

策略工厂类:一般来说,通过一个策略工厂,将一群功能相同的策略封装起来,调用更加方便。 通过一个文件处理的例子来说明;有一个文件处理的通用类,可以处理excel、txt、exe文件。 面对不同类型的文件,返回具体对应的文件处理类,也就是具体的策略类。

实战

支付实体类

/*** @Author: @weixueshi* @Create: 2023/12/31 - 11:03* @Version: v1.0*/@Data@AllArgsConstructor@NoArgsConstructorpublic class Pay implements Serializable {​private static final long serialVersionUID = 1L;​/*** 订单号*/private String orderId;​/*** 商品名称*/private String name;/*** 商品金额*/private String price;​/*** 支付方式*/private String paymentType;}

定义一个顶级支付接口

public interface PayStrategy {/*** 支付接口* @param pay* @return*/Response pay(Pay pay);}

定义两个具体实现类:支付宝和微信支付

/*** @Author: @weixueshi* @Create: 2024/3/14 - 14:48* @Version: v1.0*/​/*** 支付宝支付具体实现*/@Slf4j@Componentpublic class AlipayStrategyImpl  implements PayStrategy{​@Overridepublic Response pay(Pay pay) {//支付的具体处理逻辑log.info("我是支付宝支付------");return Response.success();}}
 ​
/**** @Author: @weixueshi* @Create: 2024/3/14 - 14:49* @Version: v1.0*/​/*** 微信支付具体实现*/@Slf4j@Componentpublic class WechatPayStrategyImpl implements PayStrategy {​@Overridepublic Response pay(Pay pay) {//支付的具体处理逻辑log.info("我是微信支付------");return Response.success();}}
 

定义一个调用支付的服务类

/*** @Author: @weixueshi* @Create: 2024/3/14 - 14:50* @Version: v1.0*/​/*** 创建支付服务类,根据用户选择的支付方式创建对应的策略对象并执行支付操作:*/@Service("payService")public class PayService {​private Map<String, PayStrategy> payStrategyMap = new HashMap<String, PayStrategy>();​public PayService() {// 将支付宝和微信支付策略对象放入Map中payStrategyMap.put("alipay",new AlipayStrategyImpl());payStrategyMap.put("wechat",new WechatPayStrategyImpl());}​public Response pay(Pay pay) {// 根据用户选择的支付方式获取对应的策略对象PayStrategy payStrategy = payStrategyMap.get(pay.getPaymentType());if (payStrategy == null) {throw new ServiceException("支付方式不支持");}// 执行支付操作return payStrategy.pay(pay);}}

最后在controller层调用支付

@Slf4j@CrossOrigin@RestController@RequiredArgsConstructorpublic class OrderPayController {​private final PayService payService;​/*** 支付接口* @return*/@PostMapping("/common")public Response commonPay(@RequestBody Pay pay){log.info("{}支付请求进来了-----------",pay.getPaymentType());return payService.pay(pay);}}

到此使用策略模式实现多种支付就已完成!

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

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

相关文章

html编辑器

HTML 编辑器推荐 html可以使用记事本编辑 但是更建议使用专业的 HTML 编辑器来编辑 HTML&#xff0c;我在这里给大家推荐几款常用的编辑器&#xff1a; VS Code&#xff1a;https://code.visualstudio.com/WebStorm: https://www.jetbrains.com/webstorm/Notepad: https://no…

命名空间——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 经典的Hello Word 起航c关键字c语言的命名冲突问题域作用限定符::命名空间 namespace命名空间定义命名空间的使用1.加命名空间名称及作用域限定符2.使用…

异常:程序出现的问题

目的&#xff1a;为了以后发现异常后怎么去处理 异常的作用

【NTN 卫星通信】 TN和多NTN配合的应用场景

1 场景描述 此场景描述了农村环境&#xff0c;其中MNO (运营商TerrA)仅在城市附近提供本地地面覆盖&#xff0c;而MNO (SatA)提供广泛的NTN覆盖。SatA使用GSO轨道和NGSO轨道上的卫星。SatA与TerrA有漫游协议&#xff0c;允许:   所有TerrA用户的连接&#xff0c;当这些用户不…

免费的chatgpt网站(包含最新版4.0)

相信每个人在生活工作学习中都逃不过用chatgpt来解决一些问题&#xff0c;下面我长话短说&#xff0c;为大家简单介绍几款免费且好用的chatgpt网站 1、YesChat 网址&#xff1a;YesChat-ChatGPT4V Dalle3 Claude 3 All in One Free 第一个就给大家介绍一个狠角色&#xff0c;最…

接口冒烟测试方法

接口冒烟测试方法 今年遇到了几个问题&#xff0c;与接口的功能和性能相关&#xff0c;恰巧最近公司也在组织以冒烟测试为主题的活动&#xff0c;于是乎突发奇想&#xff0c;寻思着能否将接口测试与冒烟测试结合起来&#xff0c;发掘一些新的接口测试思路与方法。 平时对接口…

专升本 C语言 万字考点笔记全国通用

前言 全章内容多次校验整理,可以放心食用;如果发现内容有不严谨的地方,请随时私信张三xy 形而上学者谓之道&#xff0c;形而下学者谓之器 目录 前言 常考概念 一、C语言的基础知识 第一节、对C语言的基础认识 第二节、C语言程序生命周期 第三节、标识符 第四节、进制的转…

5G里面NR,gNB,en-gNB,ng-eNB是什么意思

不得不提一个国际组织&#xff0c;叫国际电信联盟(ITU, International Telecommunication Union)&#xff0c;简称国际电联。我们先看看国际电联的自我介绍&#xff1a; 国际电信联盟 『国际电联 (国际电信联盟) 是主管信息通信技术事务&#xff08;ICT&#xff09;的联合国机…

英伟达 V100、A100/800、H100/800 GPU 对比

近期&#xff0c;不论是国外的 ChatGPT&#xff0c;还是国内诸多的大模型&#xff0c;让 AIGC 的市场一片爆火。而在 AIGC 的种种智能表现背后&#xff0c;均来自于堪称天文数字的算力支持。以 ChatGPT 为例&#xff0c;据微软高管透露&#xff0c;为 ChatGPT 提供算力支持的 A…

春分|春和景明,万物复苏,百华与您共赴春天的盛宴

春分&#xff0c;是二十四节气之一&#xff0c;标志着春季正式来临。在这个时节&#xff0c;阳光明媚&#xff0c;气温逐渐回暖&#xff0c;大自然万物开始复苏&#xff0c;呈现出一幅春和景明的美好画卷。 春分时节&#xff0c;昼夜平分&#xff0c;白天和夜晚的时间几乎一样…

Docker-镜像仓库

Docker ⛅Docker-Registry&#x1f320;分类&#x1f320;镜像仓库工作机制&#x1f320;常用的镜像仓库&#x1f320;镜像仓库命令☃️docker login☃️docker pull☃️docker push☃️docker search☃️docker logout &#x1f320;镜像命令[部分]☃️docker images☃️docke…

【呼市经开区建设服务项目水、电能耗监测 数采案例】

实施方案 针对能耗采集中的水、电能源数据采集&#xff0c;因客观因素条件&#xff0c;数据采集方面存在较大难度。大多数国网电表485接口由于封签限制&#xff0c;不能实施采集&#xff0c;不让拆机接线&#xff0c;采集实施存在困难。水量能耗采集&#xff0c;存在类似问题&a…

.net使用excel的cells对象没有value方法——学习.net的Excel工作表问题

$exception {"Public member Value on type Range not found."} System.MissingMemberException 代码准备运行问题解决1. 下载别的版本的.net框架2. 安装3. 运行 代码 Imports Excel Microsoft.office.Interop.Excel Public Class Form1Private Sub Button1_Click(…

深入浅出前端本地储存

引言 2021 年&#xff0c;如果你的前端应用&#xff0c;需要在浏览器上保存数据&#xff0c;有三个主流方案&#xff1a; CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

使用Laravel开发项目

如何使用Laravel框架开发项目 一、安装Laravel框架 1.在安装Laravel框架钱我们需要先查看要安装的Laravel框架版本以及版本所需要的安装运行条件。 2.配置好安装环境后再安装Laravel框架 2.1.配置安装环境 1&#xff09;PHP版本 2&#xff09;PHP OpenSSL扩展 3&#xff…

macOS - 获取硬件设备信息

文章目录 1、CPU获取方式 一&#xff1a; system_profiler获取方式二&#xff1a;sysctl&#xff0c; machdepmachdep 2、内存3、硬盘4、显卡5、声卡6、光驱7、系统序列号8、型号标识符9、UUID 等信息 10. 计算机名称 1、CPU 获取方式 一&#xff1a; system_profiler % syst…

这40 张图帮你搞懂分布式追踪

在微服务架构中&#xff0c;一次请求往往涉及到多个模块&#xff0c;多个中间件&#xff0c;多台机器的相互协作才能完成。 这一系列调用请求中&#xff0c;有些是串行的&#xff0c;有些是并行的&#xff0c;那么如何确定这个请求背后调用了哪些应用&#xff0c;哪些模块&…

Linux-docker安装数据库mysql

1、拉去mysql镜像&#xff1a; docker pull mysql2、创建容器挂载路径 mkdir -p /usr/local/jiuxiang/mysql/data # 数据存储位置 mkdir -p /usr/local/jiuxiang/mysql/logs # 日志存储位置 mkdir -p /usr/local/jiuxiang/mysql/conf # 配置文件3、启动容器 docker run -…

蓝桥杯 2023 省A 更小的数

主要思路&#xff1a; 输入一个长度为n的字符串&#xff0c;用二维数组dp[i][j]来记录子串[i, j]是否需要反转一次才能满足条件。使用动态规划自底向上地填充dp数组。根据问题的要求&#xff0c;需要考虑字符串的子串中字符的大小关系来判断是否需要反转。最后统计满足条件的子…

备战秋招(coding篇)

其中coding题目来源于师兄面试经验 1、链表的结构体反转链表 本质上就是一个构造函数 struct ListNode{int val_;ListNode* next_;ListNode() : val_(0), next_(NULL) {}ListNode(int x) : val_(x), next_(NULL) {}ListNode(int x, ListNode* next) : val_(x), next_(next) …