设计模式 - 基于spring的@Component注解实现策略模式

为什么要使用策略模式?

想象这样一个用户登录的场景,用户可以通过以下多种渠道登录:

  • 短信验证码登录
  • 账号密码登录
  • 第三方账号登录…

那么请考虑一下代码级别如何实现?

最土味的实现方式,相当丑陋。

public void login(String type) {
        if ("sms".equals(type)) {
            // todo 执行短信验证码登录逻辑
        } else if ("pass".equals(type)) {
            // todo 执行账号密码登录逻辑
        } else {
            // ......
        }
}

此时,我们可以通过使用策略模式来更优雅地实现用户登录。

基于spring的@Component注解实现策略模式

关于策略模式的实现方式网上有很多,我不多赘述。我这次为大家带来一个比较小众,但是很优雅的实现方式,即基于@Component注解实现。话不多说,直接上代码。

  • 首先你需要先定义一个模板(抽象类或者接口都行),然后在类上使用@Component注解。
@Component
public abstract class LoginStrategy {

    public abstract String login();
}

or

@Component
public interface LoginInterface {

    public String login();
}

  • 接下来,新建你的登录策略类实现or继承模板类。
// 账号密码登录,@Component后的pass为别名的意思,也可以不写,不写默认是passLogin

@Component("pass")
@Slf4j
public class PassLogin implements LoginInterface{

    @Override
    public String login() {
        log.info("执行账号密码登录逻辑");
        return "PassLogin";
    }
}
// 短信验证码登录

@Component("sms")
@Slf4j
public class SmsLogin implements LoginInterface{

    @Override
    public String login() {
        log.info("执行短信验证码登录逻辑");
        return "SmsLogin";
    }
}
  • 最关键的一步来了,新建LoginType类,来装载你上一步的登陆策略。
@Component
public class LoginType {

    @Autowired
    private Map<String, LoginInterface> strategy;

    public LoginInterface strategy(String type) {
        return strategy.get(type);
    }
}

这里最核心的是,strategy这个map,key值为你登录策略类的@Component后的别名,不写默认是首字母小写的类名,value类型是模板类。

  • 最后我们来验证一下:
@RestController
@RequestMapping("/strategy")
@Slf4j
public class StrategyController {

    @Autowired
    private LoginType loginType;

    @GetMapping("/{type}")
    public String type(@PathVariable("type") String type) {
        log.info("type值为:{}", type);
        LoginInterface strategy = loginType.strategy(type);
        return strategy.login();
    }
}

在这里插入图片描述
到这里,策略模式就算是实现了,是不是很神奇。

简单debug

断点进入,点击左边带对号的标记,能够看到LoginType下depends on了两个我们的登陆策略类。
在这里插入图片描述
strategy的size = 2,即spring已经自动帮我们将策略类装载进了strategy这个map里。
在这里插入图片描述

具体spring的底层实现本人目前还不清楚,后边有空深究了再补充吧。感兴趣的小伙伴欢迎评论区留言讨论。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值