SpringBoot日常:策略模式应用

SpringBoot日常:策略模式应用对于很多程序员 平时写代码为了方便 可能一股脑就按面向过程那样一下把业务逻辑编写下来 少有会去额外思考设计模式或者算法

大家好,欢迎来到IT知识分享网。

前言

对于很多程序员,平时写代码为了方便,可能一股脑就按面向过程那样一下把业务逻辑编写下来,少有会去额外思考设计模式或者算法。这种情况其实不利于我们的编码维护,在本文,将介绍设计模式中的策略模式,通过本文的介绍将帮助你快速理解和应用。

1、什么是策略模式?

策略模式是一种行为型设计模式,它通过暴露一个统一的接口,通过该接口在不同情况下根据类型执行不同的逻辑的行为。策略模式解决了在有多种算法相似的情况下,使用“if…else”所带来的复杂和难以维护的问题。

2、策略模式的结构

策略模式包括以下几个角色:

上下文(Context):持有一个策略对象的引用,并在需要时调用策略对象的方法。上下文可以根据具体情况选择不同的策略。

策略(Strategy):定义了一个公共接口,用于封装不同的算法。这个接口通常只有一个方法,即执行算法的方法。

具体策略(ConcreteStrategy):实现了策略接口,提供具体的算法实现。每个具体策略类都代表了一种特定的算法。

-策略模式的关键在于上下文持有一个策略对象的引用,并且通过调用策略对象的方法来执行具体的算法。这种方式使得上下文变得非常灵活,可以根据不同的需求在运行时切换算法。

3、策略模式的应用例子

策略模式适用于以下情况:

  • 当需要在运行时动态地选择算法实现时,可以使用策略模式。
  • 当一个类有多个行为变种,并且这些行为可以灵活地切换时,策略模式可以提供一种优雅的解决方案。

支付例子

例:比如我们常见的支付行为,当你买了一个车票,这时候发起支付可以选择微信、支付宝、银行卡等,此时我们编写一个支付接口,大多数人可能会写成如下代码:

@GetMapping(value = "/pay", produces = MediaType.APPLICATION_JSON_VALUE) public String pay(String payType) { 
    if(payType=="ALI_PAY"){ 
    System.out.println("执行支付宝的支付逻辑"); }else if(payType=="WEIXIN_PAY"){ 
    System.out.println("执行微信的支付逻辑"); }else{ 
    System.out.println(".......等等"); } return "success"; } 

当你需要加上其他类型的支付时,就不断在后面加else if,其实这违背了面向对象设计的六大原则中的单一职责和开闭原则(对扩展开放、对修改关闭)。因此我们可以用策略模式改造一下

实现方式一

1、创建一个支付处理逻辑接口

//支付处理器接口 public interface PayHandler { 
    void pay(); } 

2、创建不同支付的支付实现类
这里创建两个实现类,分别为支付宝和微信的支付实现类

@Component("AliPayHandler") public class AliPayHandler implements PayHandler{ 
    @Override public void pay() { 
    System.out.println("支付宝支付逻辑"); } } @Component("WeixinPayHandler ") public class WeixinPayHandler implements PayHandler{ 
    @Override public void pay() { 
    System.out.println("微信支付逻辑"); } } 

3、创建一个枚举类
映射不同的支付类型和对应的处理器

public enum PayHandlerEnum { 
    ALI_PAY("ALI_PAY", "AliPayHandler"), WEIXIN_PAY("WEIXIN_PAY", "WeixinPayHandler"); final String code; final String name; public String getCode() { 
    return code; } public String getName() { 
    return name; } PayHandlerEnum(String code, String name) { 
    this.code = code; this.name = name; } public static String getNameByCode(String code) { 
    PayHandlerEnum[] payHandlerEnums = values(); for (PayHandlerEnum payHandlerEnum : payHandlerEnums) { 
    if (payHandlerEnum.getCode().equals(code)) { 
    return payHandlerEnum.getName(); } } return null; } } 

4、controller支付接口

 @Autowired private ApplicationContext applicationContext; @GetMapping(value = "/pay") public String pay(@RequestParam String payType) { 
    PayHandler handler = (PayHandler) applicationContext.getBean(Objects.requireNonNull(PayHandlerEnum.getNameByCode(payType))); handler.pay(); return "success"; } 

5、执行测试
在这里插入图片描述

在这里插入图片描述

实现方式二

1、创建一个基础支付抽象类
MyBasePayService有一个支付方法

public abstract class MyBasePayService { 
    public void pay() { 
    } } 

2、创建两个具体实现的实现类

@Service public class MyAliPayService extends MyBasePayService{ 
    @Override public void pay(){ 
    System.out.println("ali pay 执行逻辑"); } } @Service public class MyWeChatPayService extends MyBasePayService { 
    @Override public void pay(){ 
    System.out.println("weixin pay 执行逻辑"); } } 

3、controller代码
具体的调用执行如下,通过传入不同的bean名称,调用到具体的支付逻辑

@Autowired private ApplicationContext applicationContext; @GetMapping("/callPayServices") public void callPayServices(@RequestParam String name) { 
    MyBasePayService payService = (MyBasePayService) applicationContext.getBean(name); payService.pay(); } 

4、执行测试
在这里插入图片描述
查看结果
在这里插入图片描述


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126462.html

(0)
上一篇 2025-09-18 17:45
下一篇 2025-09-18 18:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信