提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
策略模式-使用枚举实现
前言
记录另一种策略模式的实现:使用枚举实现策略模式
一、request
@Data
public class TrafficRequest {
/**
* 枚举类型
*/
private StrategyEnum strategyEnum;
}
二、controller
@RestController
@RequestMapping("strategy")
@RequiredArgsConstructor
public class TrafficController {
private final TrafficService trafficService;
@PostMapping(value = "test",name = "使用枚举实现策略模式")
public String getStrategyName(@RequestBody TrafficRequest trafficRequest){
return trafficService.getStrategyName(trafficRequest);
}
}
三、controller的接口类
public interface TrafficService {
String getStrategyName(TrafficRequest trafficRequest);
}
四、controller的接口类的实现类
@Service
@RequiredArgsConstructor
public class TrafficServiceImpl implements TrafficService {
private final StrategyFactory strategyFactory;
@Override
public String getStrategyName(TrafficRequest trafficRequest) {
StrategyService service = strategyFactory.getService(trafficRequest.getStrategyEnum());
return service.getTraffic(trafficRequest);
}
}
五、策略模式的工厂类
@Slf4j
@Component
public class StrategyFactory {
private static final Map<StrategyEnum, StrategyService> STRATEGY_SERVICE_MAP = new HashMap<>();
@Autowired
public StrategyFactory(List<StrategyService> strategyServices) {
Map<StrategyEnum, StrategyService> itemDataMap = strategyServices.stream().collect(Collectors.toMap(StrategyService::getType, service -> service));
STRATEGY_SERVICE_MAP.putAll(itemDataMap);
}
public StrategyService getService(StrategyEnum strategyEnum){
return STRATEGY_SERVICE_MAP.get(strategyEnum);
}
}
六、策略模式的枚举类
public enum StrategyEnum {
CAR,
SHIP,
PLANE
}
七、策略模式的接口类
public interface StrategyService {
StrategyEnum getType();
String getTraffic(TrafficRequest trafficRequest);
}
八、策略模式的接口类
public abstract class AbstractStrategyService implements StrategyService {
}
九、三个策略类的实现类
@Service
public class CarServiceImpl extends AbstractStrategyService {
@Override
public StrategyEnum getType() {
return StrategyEnum.CAR;
}
@Override
public String getTraffic(TrafficRequest trafficRequest) {
return StrategyEnum.CAR.name();
}
}
@Service
public class PlaneServiceImpl extends AbstractStrategyService {
@Override
public StrategyEnum getType() {
return StrategyEnum.PLANE;
}
@Override
public String getTraffic(TrafficRequest trafficRequest) {
return StrategyEnum.PLANE.name();
}
}
@Service
public class ShipServiceImpl extends AbstractStrategyService {
@Override
public StrategyEnum getType() {
return StrategyEnum.SHIP;
}
@Override
public String getTraffic(TrafficRequest trafficRequest) {
return StrategyEnum.SHIP.name();
}
}
总结
感兴趣的可以看下使用@Autowired+@Component(“one”)的实现策略模式。