定义
策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。简单来说,就是 “准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
核心角色
策略接口
具体策略
上下文
- 持有一个策略接口的引用。
- 可以定义一个接口来让策略访问它的数据。
- 负责将客户的请求委托给当前的策略对象执行。
策略接口和具体策略
public interface StrategyInterface {void test();}@Component
class StrategyInterfaceImpl1 implements StrategyInterface {@Overridepublic void test() {System.out.println("进入StrategyInterfaceImpl1");}}@Component
class StrategyInterfaceImpl2 implements StrategyInterface {@Overridepublic void test() {System.out.println("进入StrategyInterfaceImpl2");}}
上下文【多变种】
@Component
@RequiredArgsConstructor
public class StrategyContext {// Spring会自动将StrategyInterface的所有实现bean注入到这个Map中// Key:bean的名称,Value:对应的策略实现beanprivate final Map<String, StrategyInterface> strategyMap;// 注入所有策略private final List<StrategyInterface> strategies;public void executeStrategy(String strategyType) {StrategyInterface strategy = strategyMap.get(strategyType);if (strategy == null) {throw new BussinessException("未找到对应的策略: " + strategyType);}strategy.test();}public Set<String> getAvailableStrategies() {return strategyMap.keySet();}}
测试
@RestController
@Api(tags = "测试策略模式")
@RequiredArgsConstructor
@RequestMapping("/strategy")
public class StrategyController {private final StrategyContext strategyContext;@GetMapping("/execute")public Result<Boolean> executeStrategy(@RequestParam String type) {strategyContext.executeStrategy(type);return Result.success();}
}