首页 > 其他分享 >(工厂+策略)实现登录功能

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

时间:2024-06-01 18:10:57浏览次数:21  
标签:loginReq return 策略 登录 工厂 LoginResp new public

原始代码

业务层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的逻辑。

标签:loginReq,return,策略,登录,工厂,LoginResp,new,public
From: https://www.cnblogs.com/XiaYu-Ye/p/18226237

相关文章

  • SpringBootWeb 篇-深入了解 Filter 过滤器与 Interceptor 拦截器(实现登录校验 Filter
    ......
  • HTML+CSS+JS 熊猫登录表单
    效果演示实现了一个可爱的熊猫登录界面,页面背景使用了渐变色,熊猫的头部和身体使用了圆形和椭圆形的边框,使用了CSS的伪元素和阴影效果来实现熊猫的手和脚。登录框使用了flex布局,包括用户名和密码的输入框和登录按钮,使用了CSS的过渡效果和伪类来实现输入框的动态效果。整个......
  • 【Redis】保证redis的高并发高可用的几种策略
    保证Redis的高并发高可用性需要从多方面入手,包括架构设计、配置优化、监控和维护。以下是一些具体的策略和方法:1.Redis集群模式Redis集群模式通过将数据分片分布到多个节点上来实现高并发和高可用性。分片:将数据分布到多个节点,减少单个节点的负载。主从复制:每个主节......
  • 转 Win10 共享文件夹、打印机。 使用微软账户登录共享文件夹,如何确认账号密码。
    目的是通过该方法实现了局域网内 共享目录给电视盒子,放在电视盒子使用。感谢不爱吃山楂大佬https://zhuanlan.zhihu.com/p/446872571   Win10共享文件夹、打印机。使用微软账户登录共享文件夹,如何确认账号密码。......
  • 【链家地产_登录安全分析报告】
    前言由于网站注册入口容易被黑客攻击,存在如下安全问题:暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞所以大部分网站及App都采取图形验证码或滑动验证码等交互解决方案,但在机器学习能力提......
  • MES在数字化工厂中怎么落地?西门子,施耐德为例
    在当前制造业高度竞争的环境下,制造企业为了提高生产效率、降低成本以及优化资源利用,需要借助现代化的制造执行系统(MES)。MES,作为制造业中一种重要的管理信息系统,是数字化工厂中至关重要的一环,并在数字化转型和智能制造中发挥着关键作用。01.MES的发展MES的定义与功能:ME......
  • R语言对S&P500股票指数进行ARIMA + GARCH交易策略|附代码数据
    原文链接:http://tecdat.cn/?p=7207最近我们被客户要求撰写关于ARIMA+GARCH交易策略的研究报告,包括一些图形和统计输出。在本文中,我想向您展示如何应用S&P500股票市场指数的交易策略通过组合ARIMA和GARCH模型,从长期来看,我们可以超过“买入并持有”方法。策略概述该策略在“滚......
  • 在我的 Flutter 应用程序中尝试通过 sso 登录时,我看到了一个黑屏
    我正在调用android上flutter_appAuth软件包的authorize方法。下面是该方法的外观:finalresult=awaitFlutterAppAuth(.authorize())finalresult=awaitFlutterAppAuth().authorize(授权请求SSOConstants.clientId、SSOConstants.redirec......
  • springboot3项目的搭建四.1(security登录认证配置)
    SpringBoot3整合SpringSecurityMaven<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.2</version><relativeP......
  • springboot3项目的搭建四.2(security登录认证配置)
    SpringBoot3+SpringSecurity整合Security导包:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>模拟Redis存储登录信息:publicclassCacheEntityimpl......