ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

设计模式-策略

设计模式-策略

定义

策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。简单来说,就是 “准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

核心角色

策略接口
具体策略
上下文

  • 持有一个策略接口的引用。
  • 可以定义一个接口来让策略访问它的数据。
  • 负责将客户的请求委托给当前的策略对象执行。

策略接口和具体策略

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();}
}

测试结果

策略模式

返回列表