策略模式-使用枚举实现

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


前言

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

一、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”)的实现策略模式。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值