疫情期间,我们身先士卒,为打赢这次防疫战贡献自己的力量,搭建起一个信息化平台,支撑政府、企业、园区、员工开展防疫工作。其中基础功能:登陆,因为人群(政府、企业、员工)的不同导致登陆方式的不同。
初期,我们的代码可能是这样写的:
/**
* 登陆接口
* @param type g:政府;e:企业;p:员工
*/
@PostMapping("/login/{type}")
public String login(@PathVariable String type) {
if ("g".equals(type)) {
# 政府登陆逻辑
} else if ("e".equals(type)) {
# 企业登陆逻辑
} else if ("p".equals(type)) {
# 员工登陆逻辑
}
return token;
}
后面需求变化了,又加了一种登陆方式,那么我们的if/else就会特别的长。此时,策略模式就粉墨登场了,使用策略模式改造后的代码会是这样的:
@PostMapping("/login/{type}")
public String login(@PathVariable String type) {
retrun LoginStrategyFactory.getLoginStrategy(type).login();
}
改造后是不是很清爽啊,那就让我们使用策略模式一步一步来改造我们的代码吧!
1. 首先得有一个登陆策略接口
/**
* 登陆策略接口
*/
public interface LoginStrategy {
String login();
}
2. 然后要有实际的登陆策略
这里就列举一个政府登陆策略,而企业登陆策略,员工登陆策略,空策略(也是默认策略,匹配不到真正的策略就返回一个空策略)这里就不一一列举了。
/**
* 政府登陆策略实现类
*/
public class GovernmentLoginStrategy implements LoginStrategy {
@Override
public String login() {
System.out.println("政府登陆,访问数据库校验用户名密码");
}
}
3. 创建一个登陆策略工厂
/**
* 登陆策略工厂
*/
public final class LoginStrategyFactory {
/**
* 实际保存登陆策略的map
*/
private static Map<String, LoginStrategy> loginStrategyMap = new HashMap<>();
static {
loginStrategyMap.put("g", new GovernmentLoginStrategy());
loginStrategyMap.put("e", new EnterpriseLoginStrategy());
loginStrategyMap.put("p", new PersonalLoginStrategy());
}
/**
* 私有构造函数
*/
private LoginStrategyFactory() { }
/**
* 获取登陆策略
* @param key 登陆策略的key
* @return 登陆策略,loginStrategyMap里面没有则返回空策略
*/
public static LoginStrategy getLoginStrategy(String key) {
LoginStrategy loginStrategy = loginStrategyMap.get(key);
return loginStrategy == null ? new EmptyLoginStrategy() : loginStrategy;
}
}
好了,到这里我们的策略模式就改造完了。
如果后面再增加一种登陆方式,我们只需要写一个登陆策略,然后把该登陆策略放到登陆策略工厂里面就好了!