Spring Boot 项目如何优雅地使用策略模式

什么是策略模式?

策略模式是一种设计模式,允许在运行时选择算法或行为的模式。其核心思想是定义一系列算法,把它们一个个封装起来,并使它们可以互相替换。这种模式能够根据不同的情况动态地选择最合适的算法。

通俗来说,在开发的过程中,需要针对不同的情况做执行不同的处理方法,单纯地写 if...else... 会导致扩展性和可维护性变差。

详情看菜鸟教程:www.runoob.com/design-patt…

Spring 风格的策略模式

策略模式包含了 3 个部分,分别是:

  1. 上下文(Context)类:具体策略类的对象,本文主要介绍上下文类通过依赖注入的方式获取具体策略对象。
  2. 抽象策略(Abstract Strategy)类:定义了策略对象的公共接口或抽象类,具体策略类必须实现的方法。
  3. 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。

为了方便对比,本文直接改写菜鸟教程的举例。

抽象策略类可以是接口也可以是抽象类,这里推荐使用抽象类。 因为抽象类方法里可以写一些公有逻辑,避免重复代码。

步骤1

创建一个抽象类。

public abstract class Strategy {
    public int doOperation(int num1, int num2) {
        System.out.println("公有逻辑...");
        return 0;
    }
}

步骤2

创建基础抽象类的具体策略类。

import org.springframework.stereotype.Service;

@Service("add")
public class OperationAdd extends Strategy{
    public int doOperation(int num1, int num2) {
        super.doOperation(num1, num2);
        System.out.println("执行加法计算");
        return num1 + num2;
    }
}
import org.springframework.stereotype.Service;

@Service("subtract")
public class OperationSubtract extends Strategy{
    public int doOperation(int num1, int num2) {
        super.doOperation(num1, num2);
        System.out.println("执行减法计算");
        return num1 - num2;
    }
}
import org.springframework.stereotype.Service;

@Service("multiply")
public class OperationMultiply extends Strategy {
    public int doOperation(int num1, int num2) {
        super.doOperation(num1, num2);
        System.out.println("执行乘法计算");
        return num1 * num2;
    }
}

步骤3(重点)

在上下文(Context)类中注入策略类并调用。上下文类就是执行算法的类,在项目中一般会是一个 Service 类。

@Service
public class ContextServiceImpl implements ContextService {
    // 注入策略对象,key是注册时的名称,value是策略对象
    @Resource
    private Map<String, Strategy> strategyMap;
    
    @Override
    public int executeStrategy(int num1, int num2) {
        // 执行加法策略对象
        Strategy addStrategy = strategyMap.get("add");
        int add = addStrategy.doOperation(num1, num2);
        System.out.println("add:"+add);

        // 执行减法策略对象
        Strategy subtractStrategy = strategyMap.get("subtract");
        int subtract = subtractStrategy.doOperation(num1, num2);
        System.out.println("subtract:"+subtract);

        // 执行乘法策略对象
        Strategy multiplyStrategy = strategyMap.get("multiply");
        int multiply = multiplyStrategy.doOperation(num1, num2);
        System.out.println("multiply:"+multiply);
        
        return 0;
    }
}

步骤4

测试一下。

@SpringBootTest
public class StrategyTest {
    @Resource
    private ContextService contextService;

    @Test
    public void test(){
        contextService.executeStrategy(10, 5);
    }
}

运行结果:

公有逻辑...
执行加法计算
add:15

公有逻辑...
执行减法计算
subtract:5

公有逻辑...
执行乘法计算
multiply:50

提示

在使用策略模式时,也需要注意不要过度使用,特别是在只有少数策略时(少于3个),或者策略很不可能变化时。因为引入策略模式会增加一些对象的创建和交互,可能会引入额外的复杂性。正确的应用策略模式可以使系统设计更加灵活,易于维护和扩展。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值