设计模式-策略模式(实战教程)
本章采用实战简洁方式实现 , 会让想使用策略的更真实策略方案 单独去处理自己的业务
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) , 再不会腿给你打断
下一篇:
追梦算法----最小拐弯路径
