还记得三年前接手一个多端登录项目,用户名密码、微信、手机号验证码三种登录方式挤在一个if-else里,新增支付宝登录时整整改了17处代码,最后还漏了一处校验——那种痛苦至今难忘。今天我要分享一个让登录功能优雅如诗的解决方案!
为什么你的登录代码像"意大利面条"?
传统写法是这样的:
public String login(String loginType, Map<String, Object> params) {
if ("password".equals(loginType)) {
// 用户名密码登录逻辑
} else if ("wechat".equals(loginType)) {
// 微信登录逻辑
} else if ("sms".equals(loginType)) {
// 手机号登录逻辑
} else {
throw new IllegalArgumentException("不支持的登录类型");
}
}
这种写法有三大致命伤:
- 扩展性差:新增登录方式要改if-else,违反开闭原则
- 职责混乱:所有逻辑挤在一个类里,可读性差
- 复用困难:不同登录方式的公共逻辑无法抽取
设计模式拯救世界:策略+工厂模式
策略模式:让每种登录方式独立成"演员"
将每种登录方式封装成独立策略类,实现统一接口:
public interface LoginStrategy {
String getLoginType(); // 如"password"、"wechat"
String execute(Map<String, Object> params);
}
工厂模式:让"导演"决定用哪个"演员"
通过工厂类根据登录类型创建对应的策略实例:
@Component
public class LoginStrategyFactory {
private final Map<String, LoginStrategy> strategyMap;
public LoginStrategy getStrategy(String loginType) {
LoginStrategy strategy = strategyMap.get(loginType);
if (strategy == null) {
throw new IllegalArgumentException("不支持的登录类型:" + loginType);
}
return strategy;
}
}
Spring Boot实战:三步搞定优雅登录
第一步:定义策略实现
以用户名密码登录为例:
@Service
public class PasswordLoginStrategy implements LoginStrategy {
@Override
public String getLoginType() { return "password"; }
@Override
public String execute(Map<String, Object> params) {
String username = (String) params.get("username");
String password = (String) params.get("password");
// 校验逻辑...
return "登录成功(用户名密码)";
}
}
第二步:配置策略Bean
@Configuration
public class StrategyConfig {
@Bean("passwordStrategy")
public LoginStrategy passwordLoginStrategy() {
return new PasswordLoginStrategy();
}
// 其他策略...
}
第三步:控制器集成
@RestController
@RequestMapping("/login")
public class LoginController {
private final LoginStrategyFactory factory;
@PostMapping
public String login(@RequestBody LoginRequest request) {
return factory.getStrategy(request.getLoginType())
.execute(request.getParams());
}
}
为什么这个方案如此优雅?
- 扩展性爆表:新增登录方式只需添加新策略类,不用改现有代码
- 可读性极佳:每种登录逻辑独立封装,一目了然
- 测试超简单:可以单独测试每个策略类
- 维护成本低:修改一种登录方式不会影响其他登录方式
最佳实践小贴士
- 参数校验前置:在控制器中先做基础校验
- 公共逻辑抽取:创建抽象策略类复用公共代码
- 异常处理统一:自定义业务异常返回友好错误信息
- 配置化登录类型:将支持的登录类型存储在配置文件中
总结:让代码优雅是一种态度
使用策略模式+工厂模式重构登录功能后,我最大的感受是:好的设计模式能让代码在需求变化面前保持优雅。就像给登录模块装了一个"热插拔"接口,新增功能时不用改核心逻辑,只需要添加新的"插件"。
希望这个方案能帮你告别登录功能的维护噩梦!如果你有更好的想法,欢迎在评论区交流~