簡介
在學習設計模式的時候我們都是沒有用到框架的脑融,很多時候看起來理解了但是在到實際開發(fā)環(huán)境的時候就想不起來或者用錯衬潦,下面我介紹一種在項目中實際運用的策略模式我覺得是很符合設計原則的方法。
實現(xiàn)
首先我們假定在一個接口有三個不同的實現(xiàn):
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方法,這個方法的作用就是在接口的實現(xiàn)中根據(jù)傳入的type返回是否是當前實現(xiàn)的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的方法苟弛,在這個里面通過函數(shù)式的方法進行判斷usertype,然后能匹配到就執(zhí)行方法阁将,沒有跑匹配到就拋出異常膏秫。
總結
這樣實現(xiàn)的代碼后面新增UserType的時候只需要新增userService的接口實現(xiàn)就好,是不需要修改其他任何代碼的做盅,完全符合開閉原則缤削。