策略模式的简单运用
类结构示例图
伪代码
public interface StrategyService {
/**
* 业务代码
* @param productDto 入参
*/
void genProduct(ProductDto productDto);
/**
* 获取策略
* @return ENRule 标志策略bean的枚举值
*/
ENRule getStrategyRule();
}
@Component
@Slf4j
public class OneStrategyServiceImpl implements StrategyService {
@Override
public void genProduct(ProductDto productDto) {
log.info("业务处理");
}
@Override
public ENRule getStrategyRule() {
return ENRule.ONESTRATEGY;
}
}
@Component
@Slf4j
public class TwoStrategyServiceImpl implements StrategyService {
@Override
public void genProduct(ProductDto productDto) {
log.info("业务处理")
}
@Override
public ENRule getStrategyRule() {
return ENRule.TWOSTRATEGY;
}
}
@Component
public class StrategyFactory {
private static final Map<ENRule, StrategyService> STRATEGY_HASH_MAP = new HashMap<>();
@Autowired
private StrategyFactory(List<StrategyService> strategyServiceList) {
for (StrategyService strategyService : strategyServiceList) {
STRATEGY_HASH_MAP.put(strategyService.getStrategyRule(), strategyService);
}
}
public static StrategyService getStrategy(ENRule rule) {
return STRATEGY_HASH_MAP.get(rule);
}
}
// 方法调用
// StrategyFactory.getStrategy(rule).genProduct(productDto);
备注
在策略类上加入泛型可以嵌套其他入参及返回值,得到不同的返回值,实现工厂模式的运用。