设计模式-策略模式(实战教程)
本章采用实战简洁方式实现 , 会让想使用策略的更真实策略方案 单独去处理自己的业务
1 . controller
@Api(tags = "策略") @RestController @RequestMapping("/strategic") public class StrategicController { @Autowired private final Map<String, StrategicService> strategicMap = new ConcurrentHashMap<>(); @ApiOperation(value = "策略实现") @RequestMapping("/strategic/{id}") public String strategic(@PathVariable("id")Integer id){ return strategicMap.values() .stream() .filter(handler->handler.isMathed(TypeMenu.getByCode(id))) .findFirst() .orElseGet(BlueServiceImpl::new) .handle(id); } }
很多小伙伴不理解这为什么这样子写 , 小编为大家解答一下啊
1 . stream()这个是jdk1.8新特性不会的话去学一学
2 . handler->handler.isMathed(TypeMenu.getByCode(id)), 就是策略对比,如果有返回true否则false,下面会看到此方法
3 . findFirst() .orElseGet(BlueServiceImpl::new)这两个需要学一下上面说的stream
这个就是在filter为true的情况下会走第一个 否则会走这个策略实现
4 . handle(id)这个就是具体的实现策略方法
6 . 枚举类(handler.isMathed()方法的实现)
@Getter @AllArgsConstructor public enum TypeMenu { BULE(1, "蓝色"), GREEN(2, "绿色"); private final Integer code; private final String value; public static TypeMenu getByCode(Integer code) { return Arrays.stream(TypeMenu.values()) .filter(d -> Objects.equals(d.code, code)) .findFirst() .orElse(null); } }
7 . 策略接口(这就是上面controller的实现和对比)
//策略接口 public interface StrategicService { //策略对比 boolean isMathed(TypeMenu menu); //策略实现 String handle(Integer id); }
8 . 策略id传入的不同对应的实现不同(1是蓝色策略)
@Service public class BlueServiceImpl implements StrategicService { @Override public boolean isMathed(TypeMenu menu) { return Objects.equals(menu,TypeMenu.BULE); } @Override public String handle(Integer id) { //这可以实现你的逻辑 返回参数也可以跟着改变 return "蓝色策略"; } }
9 . 跟上面同理(2是绿色策略)
@Service public class GreenServieImpl implements StrategicService { @Override public boolean isMathed(TypeMenu menu) { return Objects.equals(menu,TypeMenu.GREEN); } @Override public String handle(Integer id) { //这可以实现你的逻辑 返回参数也可以跟着改变 return "绿色策略"; } }
注意!!!!!!!!!!!! id只是我单纯的传的 , 根据自己的业务实现而采用不同的传入参数
废话不多说上测试(用的PostMan) , 再不会腿给你打断
下一篇:
追梦算法----最小拐弯路径