首页 > 基础资料 博客日记
(工厂+策略)实现登录功能
2024-06-01 18:30:03基础资料围观452次
本篇文章分享(工厂+策略)实现登录功能,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识
原始代码
业务层UserService
@Service
public class UserService {
public LoginResp login(LoginReq loginReq){
if(loginReq.getType().equals("account")){
System.out.println("用户名密码登录");
//执行用户密码登录逻辑
return new LoginResp();
}else if(loginReq.getType().equals("sms")){
System.out.println("手机号验证码登录");
//执行手机号验证码登录逻辑
return new LoginResp();
}else if (loginReq.getType().equals("we_chat")){
System.out.println("微信登录");
//执行用户微信登录逻辑
return new LoginResp();
}
LoginResp loginResp = new LoginResp();
loginResp.setSuccess(false);
System.out.println("登录失败");
return loginResp;
}
}
注意:我们重点讲的是设计模式,并不是登录的逻辑,所以以上代码并没有真正的实现登录功能
问题分析
- 业务层代码大量使用到了if...else,在后期阅读代码的时候会非常不友好,大量使用if...else性能也不高
- 如果业务发生变更,比如现在新增了QQ登录方式,这个时候需要修改业务层代码,违反了开闭原则
解决:
使用工厂方法设计模式+策略模式解决
改进代码
要将上述代码改为使用工厂模式和策略模式,首先我们需要定义几个关键元素:策略接口、具体策略类、策略工厂以及修改UserService
来使用这些策略。下面是改造后的代码示例:
1. 定义策略接口
public interface LoginStrategy {
LoginResp login(LoginReq loginReq);
}
2. 创建具体策略类
AccountLoginStrategy
@Service
public class AccountLoginStrategy implements LoginStrategy {
@Override
public LoginResp login(LoginReq loginReq) {
System.out.println("用户名密码登录");
// 执行用户密码登录逻辑
return new LoginResp();
}
}
SmsLoginStrategy
@Service
public class SmsLoginStrategy implements LoginStrategy {
@Override
public LoginResp login(LoginReq loginReq) {
System.out.println("手机号验证码登录");
// 执行手机号验证码登录逻辑
return new LoginResp();
}
}
WeChatLoginStrategy
@Service
public class WeChatLoginStrategy implements LoginStrategy {
@Override
public LoginResp login(LoginReq loginReq) {
System.out.println("微信登录");
// 执行用户微信登录逻辑
return new LoginResp();
}
}
3. 实现策略工厂
@Service
public class LoginStrategyFactory {
@Autowired
private AccountLoginStrategy accountLoginStrategy;
@Autowired
private SmsLoginStrategy smsLoginStrategy;
@Autowired
private WeChatLoginStrategy weChatLoginStrategy;
public LoginStrategy getLoginStrategy(String type) {
switch (type) {
case "account":
return accountLoginStrategy;
case "sms":
return smsLoginStrategy;
case "we_chat":
return weChatLoginStrategy;
default:
throw new IllegalArgumentException("Invalid login type");
}
}
}
4. 修改UserService使用策略
@Service
public class UserService {
@Autowired
private LoginStrategyFactory loginStrategyFactory;
public LoginResp login(LoginReq loginReq){
LoginStrategy strategy = loginStrategyFactory.getLoginStrategy(loginReq.getType());
if(strategy == null){
LoginResp loginResp = new LoginResp();
loginResp.setSuccess(false);
System.out.println("登录失败: 无效的登录类型");
return loginResp;
}
return strategy.login(loginReq);
}
}
通过这种方式,UserService
不再直接包含各种登录逻辑,而是通过策略工厂获取对应的策略对象来处理登录请求,这使得代码更加灵活和可扩展。如果需要添加新的登录方式,只需增加一个新的策略类并修改工厂类即可,无需修改UserService
的逻辑。
文章来源:https://www.cnblogs.com/XiaYu-Ye/p/18226237
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- springboot~3.x项目中使用集成测试
- Java测试类、工具类与JavaBean对比解析
- SpringBoot-日志
- springboot~http2的支持
- 解疑释惑 - 日志体系之 slf4j + logback 组合(一)
- Web server failed to start. Port 8080 was already in use. 端口被占用
- Springboot 项目配置多数据源
- 伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 05
- 剑指offer-23、搜索⼆叉树的后序遍历序列
- 一个表示金额的数字是 100000000L,这是多少米?