• 策略模式-使用枚举实现


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    记录另一种策略模式的实现:使用枚举实现策略模式

    一、request

    @Data
    public class TrafficRequest {
        /**
         * 枚举类型
         */
        private StrategyEnum strategyEnum;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、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);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    三、controller的接口类

    public interface TrafficService {
    
        String getStrategyName(TrafficRequest trafficRequest);
    }
    
    • 1
    • 2
    • 3
    • 4

    四、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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    五、策略模式的工厂类

    @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);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    六、策略模式的枚举类

    public enum StrategyEnum {
        CAR,
        SHIP,
        PLANE
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    七、策略模式的接口类

    public interface StrategyService {
    
        StrategyEnum getType();
    
        String getTraffic(TrafficRequest trafficRequest);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    八、策略模式的接口类

    public abstract class AbstractStrategyService implements StrategyService {
    }
    
    • 1
    • 2

    九、三个策略类的实现类

    @Service
    public class CarServiceImpl extends AbstractStrategyService {
    
        @Override
        public StrategyEnum getType() {
            return StrategyEnum.CAR;
        }
    
        @Override
        public String getTraffic(TrafficRequest trafficRequest) {
            return StrategyEnum.CAR.name();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    @Service
    public class PlaneServiceImpl extends AbstractStrategyService {
    
        @Override
        public StrategyEnum getType() {
            return StrategyEnum.PLANE;
        }
    
        @Override
        public String getTraffic(TrafficRequest trafficRequest) {
            return StrategyEnum.PLANE.name();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    @Service
    public class ShipServiceImpl extends AbstractStrategyService {
    
        @Override
        public StrategyEnum getType() {
            return StrategyEnum.SHIP;
        }
    
        @Override
        public String getTraffic(TrafficRequest trafficRequest) {
            return StrategyEnum.SHIP.name();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    总结

    感兴趣的可以看下使用@Autowired+@Component(“one”)的实现策略模式。

  • 相关阅读:
    MongoDB聚合运算符:$sin
    (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
    Linux下的第一个小程序——进度条
    如何解决代理ip服务器连接问题
    如何恢复被.carver勒索病毒加密的数据?
    用DIV+CSS技术设计的西安旅游网站18页(web前端网页制作课作业)HTML+CSS旅游网站设计与实现
    windows域KCC知识点
    模拟HashMap冲突
    Vue 项目部署到GitHub Pages
    Swift开发学习
  • 原文地址:https://blog.csdn.net/qq_37700773/article/details/125627994