策略模式实战

复制代码
项目推荐

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

前台首页

后台管理员

后台商户端

什么是策略模式呢?

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

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

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

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

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

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

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

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

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

实战

支付实体类

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

定义一个顶级支付接口

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

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

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

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

java 复制代码
/**
  * @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层调用支付

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

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

相关推荐
好好研究1 小时前
Spring Boot - Thymeleaf模板引擎
java·spring boot·后端·thymeleaf
她说..1 小时前
策略模式+工厂模式实现单接口适配多审核节点
java·spring boot·后端·spring·简单工厂模式·策略模式
计算机毕业编程指导师2 小时前
大数据可视化毕设:Hadoop+Spark交通分析系统从零到上线 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·城市交通
像少年啦飞驰点、2 小时前
零基础入门 Spring Boot:从“Hello World”到可部署微服务的完整学习路径
java·spring boot·微服务·编程入门·后端开发
计算机毕业编程指导师2 小时前
【计算机毕设选题】基于Spark的车辆排放分析:2026年热门大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·车辆排放
undsky_2 小时前
【RuoYi-SpringBoot3-Pro】:将 AI 编程融入传统 java 开发
java·人工智能·spring boot·ai·ai编程
HAPPY酷2 小时前
构建即自由:一份为创造者设计的 Windows C++ 自动化构建指南
开发语言·c++·ide·windows·python·策略模式·visual studio
无尽的沉默3 小时前
使用Spring Initializr 快速创建Maven管理的springBoot项目
spring boot·spring·maven
qq_12498707533 小时前
基于springboot的林业资源管理系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
indexsunny3 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa