设计模式-策略工厂

561 阅读3分钟

在Spring Boot项目中使用策略工厂

策略模式是一种常见的设计模式,它允许我们根据不同的情况选择不同的算法或行为。在Java中,我们可以使用接口和实现类来实现这种模式。

在一个大型的项目中,可能会有很多不同的策略需要实现,而且这些策略可能会在不同的时间和地点被调用。在这种情况下,使用策略工厂可以让我们更加灵活地管理这些策略。

在本文中,我们将介绍如何在Spring Boot项目中使用策略工厂来管理不同的策略。

创建策略工厂接口

首先,我们需要创建一个接口来定义策略工厂应该实现的方法。在这里,我们定义了一个泛型接口,该接口包含一个getStrategy方法,该方法将根据传递的策略类型返回相应的策略。

public interface StrategyFactory<T> {
    Strategy<T> getStrategy(String strategyType);
}

创建策略工厂实现类

接下来,我们需要创建一个实现StrategyFactory接口的类,该类将返回不同类型的策略。在这里,我们使用了Spring的自动装配功能(@Autowired)来创建一个实现StrategyFactory接口的类。

我们还使用了一个Map来存储不同类型的策略,这些策略都是在构造函数中通过一个List参数传递的。在这里,我们使用Java 8的Stream API将该List转换为一个Map,其中Map的键是策略的类型,而Map的值是策略本身。

最后,我们实现了getStrategy方法,该方法根据传递的参数(即策略类型)返回相应的策略。

@Component
public class MyStrategyFactory implements StrategyFactory<String> {

    private final Map<String, Strategy<String>> strategyMap;

    @Autowired
    public MyStrategyFactory(List<Strategy<String>> strategyList) {
        this.strategyMap = strategyList.stream().collect(Collectors.toMap(Strategy::getType, Function.identity()));
    }

    @Override
    public Strategy<String> getStrategy(String strategyType) {
        return strategyMap.get(strategyType);
    }
}

创建策略接口和实现类

现在,我们需要创建一个接口来定义策略应该实现的方法。在这里,我们定义了一个泛型接口,该接口包含一个getType方法,该方法将返回策略的类型,以及一个execute方法,该方法将执行策略并返回结果。

public interface Strategy<T> {
    String getType();
    T execute(T input);
}

接下来,我们需要创建一些实现Strategy接口的类。在这里,我们创建了两个具体的策略类:StrategyA和StrategyB。这些类都实现了getType和execute方法,并分别返回了它们自己的类型和执行结果。

@Component
public class StrategyA implements Strategy<String> {
    @Override
    public String getType() {
        return "A";
    }

    @Override
    public String execute(String input) {
        return "Strategy A executed with input: " + input;
    }
}

@Component
public class StrategyB implements Strategy<String> {
    @Override
    public String getType() {
        return "B";
    }

    @Override
    public String execute(String input) {
        return "Strategy B executed with input: " + input;
    }
}

在Spring Boot项目中使用策略工厂

最后,我们可以在Spring Boot项目中使用我们的策略工厂来获取并执行相应的策略。在这里,我们创建了一个runStrategy方法,该方法将接受一个策略类型和一个输入参数,并使用策略工厂来获取相应的策略。然后,我们执行该策