(工厂+策略)实现登录功能

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

原始代码

业务层UserService
  1. @Service
  2. public class UserService {
  3.     public LoginResp login(LoginReq loginReq){
  4.         if(loginReq.getType().equals("account")){
  5.             System.out.println("用户名密码登录");
  6.             //执行用户密码登录逻辑
  7.             return new LoginResp();
  8.         }else if(loginReq.getType().equals("sms")){
  9.             System.out.println("手机号验证码登录");
  10.             //执行手机号验证码登录逻辑
  11.             return new LoginResp();
  12.         }else if (loginReq.getType().equals("we_chat")){
  13.             System.out.println("微信登录");
  14.             //执行用户微信登录逻辑
  15.             return new LoginResp();
  16.         }
  17.         LoginResp loginResp = new LoginResp();
  18.         loginResp.setSuccess(false);
  19.         System.out.println("登录失败");
  20.         return loginResp;
  21.     }
  22. }
复制代码
注意:我们重点讲的是计划模式,并不是登录的逻辑,所以以上代码并没有真正的实现登录功能
问题分析


  • 业务层代码大量使用到了if...else,在后期阅读代码的时候会非常不友好,大量使用if...else性能也不高
  • 如果业务发生变更,比如如今新增了QQ登录方式,这个时候需要修改业务层代码,违反了开闭原则
解决:

使用工厂方法计划模式+策略模式解决
改进代码

要将上述代码改为使用工厂模式和策略模式,首先我们需要界说几个关键元素:策略接口、详细策略类、策略工厂以及修改UserService来使用这些策略。下面是改造后的代码示例:
1. 界说策略接口
  1. public interface LoginStrategy {
  2.     LoginResp login(LoginReq loginReq);
  3. }
复制代码
2. 创建详细策略类

AccountLoginStrategy
  1. @Service
  2. public class AccountLoginStrategy implements LoginStrategy {
  3.     @Override
  4.     public LoginResp login(LoginReq loginReq) {
  5.         System.out.println("用户名密码登录");
  6.         // 执行用户密码登录逻辑
  7.         return new LoginResp();
  8.     }
  9. }
复制代码
SmsLoginStrategy
  1. @Service
  2. public class SmsLoginStrategy implements LoginStrategy {
  3.     @Override
  4.     public LoginResp login(LoginReq loginReq) {
  5.         System.out.println("手机号验证码登录");
  6.         // 执行手机号验证码登录逻辑
  7.         return new LoginResp();
  8.     }
  9. }
复制代码
WeChatLoginStrategy
  1. @Service
  2. public class WeChatLoginStrategy implements LoginStrategy {
  3.     @Override
  4.     public LoginResp login(LoginReq loginReq) {
  5.         System.out.println("微信登录");
  6.         // 执行用户微信登录逻辑
  7.         return new LoginResp();
  8.     }
  9. }
复制代码
3. 实现策略工厂
  1. @Service
  2. public class LoginStrategyFactory {
  3.    
  4.     @Autowired
  5.     private AccountLoginStrategy accountLoginStrategy;
  6.    
  7.     @Autowired
  8.     private SmsLoginStrategy smsLoginStrategy;
  9.    
  10.     @Autowired
  11.     private WeChatLoginStrategy weChatLoginStrategy;
  12.    
  13.     public LoginStrategy getLoginStrategy(String type) {
  14.         switch (type) {
  15.             case "account":
  16.                 return accountLoginStrategy;
  17.             case "sms":
  18.                 return smsLoginStrategy;
  19.             case "we_chat":
  20.                 return weChatLoginStrategy;
  21.             default:
  22.                 throw new IllegalArgumentException("Invalid login type");
  23.         }
  24.     }
  25. }
复制代码
4. 修改UserService使用策略
  1. @Service
  2. public class UserService {
  3.     @Autowired
  4.     private LoginStrategyFactory loginStrategyFactory;
  5.     public LoginResp login(LoginReq loginReq){
  6.         LoginStrategy strategy = loginStrategyFactory.getLoginStrategy(loginReq.getType());
  7.         if(strategy == null){
  8.             LoginResp loginResp = new LoginResp();
  9.             loginResp.setSuccess(false);
  10.             System.out.println("登录失败: 无效的登录类型");
  11.             return loginResp;
  12.         }
  13.         return strategy.login(loginReq);
  14.     }
  15. }
复制代码
通过这种方式,UserService不再直接包罗各种登录逻辑,而是通过策略工厂获取对应的策略对象来处理登录哀求,这使得代码更加灵活和可扩展。如果需要添加新的登录方式,只需增长一个新的策略类并修改工厂类即可,无需修改UserService的逻辑。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表