【设计模式实战】登录功能别再if-else了!Spring Boot+策略模式让你的代码起飞!

370 阅读3分钟

还记得三年前接手一个多端登录项目,用户名密码、微信、手机号验证码三种登录方式挤在一个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("不支持的登录类型");
    }
}

这种写法有三大致命伤:

  1. ​扩展性差​​:新增登录方式要改if-else,违反开闭原则
  2. ​职责混乱​​:所有逻辑挤在一个类里,可读性差
  3. ​复用困难​​:不同登录方式的公共逻辑无法抽取

10018.jpeg

设计模式拯救世界:策略+工厂模式

策略模式:让每种登录方式独立成"演员"

将每种登录方式封装成独立策略类,实现统一接口:

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());
    }
}

为什么这个方案如此优雅?

  1. ​扩展性爆表​​:新增登录方式只需添加新策略类,不用改现有代码
  2. ​可读性极佳​​:每种登录逻辑独立封装,一目了然
  3. ​测试超简单​​:可以单独测试每个策略类
  4. ​维护成本低​​:修改一种登录方式不会影响其他登录方式

10028.jpeg

最佳实践小贴士

  1. ​参数校验前置​​:在控制器中先做基础校验
  2. ​公共逻辑抽取​​:创建抽象策略类复用公共代码
  3. ​异常处理统一​​:自定义业务异常返回友好错误信息
  4. ​配置化登录类型​​:将支持的登录类型存储在配置文件中

总结:让代码优雅是一种态度

使用策略模式+工厂模式重构登录功能后,我最大的感受是:​​好的设计模式能让代码在需求变化面前保持优雅​​。就像给登录模块装了一个"热插拔"接口,新增功能时不用改核心逻辑,只需要添加新的"插件"。

希望这个方案能帮你告别登录功能的维护噩梦!如果你有更好的想法,欢迎在评论区交流~