简介
在学习设计模式的时候我们都是没有用到框架的,很多时候看起来理解了但是在到实际开发环境的时候就想不起来或者用错,下面我介绍一种在项目中实际运用的策略模式我觉得是很符合设计原则的方法。
实现
首先我们假定在一个接口有三个不同的实现:
public interface UserService {
boolean isUserType(String userType);
String execute(Object data);
}
@Service
public class ManagerServiceImpl implements UserService {
private static final String USER_TYPE = "manager";
@Override
public boolean isUserType(String userType) {
return USER_TYPE.equalsIgnoreCase(userType);
}
@Override
public String execute(Object data) {
return "ManagerServiceImpl execute";
}
}
-------------------------------------
@Service
public class OfficeEmployeeServiceImpl implements UserService{
private static final String USER_TYPE = "office";
@Override
public boolean isUserType(String userType) {
return USER_TYPE.equalsIgnoreCase(userType);
}
@Override
public String execute(Object data) {
return "OfficeEmployeeServiceImpl execute";
}
}
-------------------------------------
@Service
public class WorkshopEmployeeServiceImpl implements UserService{
private static final String USER_TYPE = "Workshop";
@Override
public boolean isUserType(String userType) {
return USER_TYPE.equalsIgnoreCase(userType);
}
@Override
public String execute(Object data) {
return "WorkshopEmployeeServiceImpl execute";
}
}
可以看到在接口中我们加了一个isUserType方法,这个方法的作用就是在接口的实现中根据传入的type返回是否是当前实现的type,返回TRUE/FALSE。
接着我们在controller层,做策略的判断:
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class UserController {
private final List<UserService> userServices;
@PostMapping("/user")
public String executeAction(@RequestBody User user) {
return sendAction(user.getType(), user);
}
//策略判断
private String sendAction(String userType, User user) {
return userServices
.stream()
.filter(e -> e.isUserType(userType))
.findFirst()
.orElseThrow(NullPointerException::new)
.execute(user);
}
}
可以看到我们添加一个sendAction的方法,在这个里面通过函数式的方法进行判断usertype,然后能匹配到就执行方法,没有跑匹配到就抛出异常。
总结
这样实现的代码后面新增UserType的时候只需要新增userService的接口实现就好,是不需要修改其他任何代码的,完全符合开闭原则。