快捷搜索: 王者荣耀 脱发

设计模式-策略模式(实战教程)

本章采用实战简洁方式实现 , 会让想使用策略的更真实策略方案 单独去处理自己的业务

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) , 再不会腿给你打断

经验分享 程序员 微信小程序 职场和发展