Spring Boot 项目怎么使用策略模式?

2024-08-05 16:06:41 浏览数 (1)

什么是策略模式?

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

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

Spring 风格的策略模式

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

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

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

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

步骤1

创建一个抽象类。

代码语言:javascript复制
java 代码解读复制代码public abstract class Strategy {
    public int doOperation(int num1, int num2) {
        System.out.println("公有逻辑...");
        return 0;
    }
}

步骤2

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

代码语言:javascript复制
java 代码解读复制代码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;
    }
}
代码语言:javascript复制
java 代码解读复制代码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;
    }
}
代码语言:javascript复制
java 代码解读复制代码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 类。

代码语言:javascript复制
java 代码解读复制代码@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

测试一下。

代码语言:javascript复制
java 代码解读复制代码@SpringBootTest
public class StrategyTest {
    @Resource
    private ContextService contextService;

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

运行结果:

代码语言:javascript复制
makefile 代码解读复制代码公有逻辑...
执行加法计算
add:15

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

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

提示

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

0 人点赞