策略者模式
简单的说就是提供一种策略,实现不同的结果展示
例:
比如我们需要根据某个条件去判断用户具有的权限,我们会写很多的if(){}这样的判断,而策略者就是为了解决这样的问题;
当然他也很多缺点,还是要根据实际情况进行应该
基于Spring实现
1.策略者
public interface AbstractHandler {
/**
* 策略接口
* @param userName
* @return
*/
SysUser handle(String userName);
}
2.策略实现
@Component(value = "dylan")
public class SysUserPermit implements AbstractHandler {
@Override
public SysUser handle(String userName) {
SysUser sysUser = new SysUser.SysUserBuild().
setRole("admin").
setUserName("dylan").
setPassWord("dylan").
setUserType("select insert update delete").buildTwo();
return sysUser;
}
}
----------------------------------------------------------------------
@Component(value = "yhj")
public class SysUserRole implements AbstractHandler{
@Override
public SysUser handle(String userName) {
SysUser sysUser = new SysUser.SysUserBuild().
setRole("guset").
setUserName("yhj").
setPassWord("yhj").
setUserType("select").buildTwo();
return sysUser;
}
}
3.客户端
public class SysUserContext {
/**
* 通过Spring上下文实现自动管理,获取不同的ID进行匹配
*/
@Autowired
private final Map strategyMap = new ConcurrentHashMap<>();
@Autowired
public SysUserContext(Map strategyMap) {
this.strategyMap.clear();
strategyMap.forEach((k, v)-> this.strategyMap.put(k, v));
}
/**
* 根据不同用户名查询
* @param userName
* @return
*/
public SysUser getResource(String userName){
return strategyMap.get(userName).handle(userName);
}
}
调用实例
@RestController
@RequestMapping(value = "/javayh/")
public class SysUserController {
@Autowired
private SysUserContext sysUserContext;
/**
* 根据用户名查询用户信息
* @param userName
* @return
*/
@GetMapping(value = "query/{userName}")
public Result query(@PathVariable String userName){
SysUser resource = sysUserContext.getResource(userName);
return Result.javaYhQuerySuccess(resource);
}
}
效果展示
从上面的效果可以看出,我们只需要关注用户名即可,具体如何去掉用我们不在关注,无需在写if的判断,可以说是if的高级写法吧!
今天的分享就到这里,希望对看到的朋友有所帮助
小编寄语
小编创建了一个关于Java学习讨论的微信群!想进去的可以联系小编!同时也欢迎大家点赞与转发!
小编微信:372787553
备注为进群,通过后小编会邀请您进群!
Ja
va
有
货
因
您
而
美
原文始发于微信公众号(Java有货):面试必问的设计模式 之 策略者模式实现