这里使用登录做例子介绍如何实现登录的多种策略


上图是策略模式的基础模型。
context
Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
Strategy
策略角色,接口类,封装相同类型策略公共方法,具体策略实现算法
ConcreteStrategy
具体策略实现Strategy中的抽象方法,编写具体算法实现。
至此基本的策略模式就说完了,具体实现看下面在spring中我们如何实现这种策略模式来实现多种登录方式:
在spring中怎样实现Context 上下文角色

/*** 策略工厂,从spring上下文中提取策略* @author :Cai.ChangJun* @version 1.0.0* @Date : 2021/6/1*/
@Component
public class LoginStrategyFactory implements InitializingBean, ApplicationContextAware {private final Map<LoginType, LoginService> strategyMap = new ConcurrentHashMap<>();private ApplicationContext appContext;@Overridepublic void afterPropertiesSet() throws Exception {// 将 Spring 容器中所有的 LoginHandler 注册到 strategyMapappContext.getBeansOfType(LoginService.class).values().forEach(hander->strategyMap.put(hander.getLoginType(),hander));}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {appContext = applicationContext;}public LoginService getStrategy(LoginType loginType) {return strategyMap.get(loginType);}
}

首先实现ApplicationContextAware,在spring容器启动成功后将spring上下文注入到策略工厂中appContext
InitializingBean接口重写afterPropertiesSet 在bean初始化的时候去初始化strategyMap,从spring上下文中提取粗所有LoginService的实现类(具体策略)
定义策略角色(Strategy)

public interface LoginService {/*** 获取登录类型* @description:* @author Cai.ChangJun* @return: 登录类型* @version 1.0.0* @Date 2021/6/1 17:35*/LoginType getLoginType();/*** 登录并获得token一小时过期 缓存登录对象半小时过期* @author Cai.ChangJun* @param username : 用户名* @param password : 密码* @return UserDTO : 登录对象抽象* @version 1.0.0* @Date 2021/5/26 23:48*/UserDTO login(String username, String password);
}

具体策略实现

@Component
@Slf4j
public class PhoneChatLoginStrategy implements LoginService {@Overridepublic LoginType getLoginType() {return LoginType.PHONE;}@Overridepublic UserDTO login(String username, String password) {//TODO 未实现手机登录log.info("手机登录成功");return new UserDTO();}
}
@Component
@Slf4j
public class WeChatLoginStrategy  implements LoginService {@Overridepublic LoginType getLoginType() {return LoginType.WE_CHAT;}@Overridepublic UserDTO login(String username, String password) {//TODO 未实现微信登录log.info("微信登录成功");return new UserDTO();}
}

每个策略我们提供了一个枚举,这样方便我们取具体策略。

public enum LoginType {QQ,WE_CHAT,PHONE;
}
我们这里写了两个登录策略,具体调用:
@RestController
@RequestMapping("/user")
@Slf4j
public class PublicUserController {@Autowiredprivate LoginStrategyFactory loginStrategyFactory;@PostMapping("/login")public Response<UserDTO> login(@RequestBody @Validated LoginParam loginParam) {log.info("用户登录:{}",loginParam.getUsername());LoginService strategy =                              loginStrategyFactory.getStrategy(loginParam.getLoginType());UserDTO login = strategy.login(loginParam.getUsername(), loginParam.getPassword());return new Response<>(login);}
}

这样我们就完成了在spring中使用策略模式完成多种登录策略。

spring如何使用策略模式相关推荐

  1. 设计模式(三)策略模式——在Spring中使用策略模式

    前言 在 设计模式(一)策略模式 -- 策略模式结构 和 设计模式(二)策略模式 -- 在程序中通过枚举使用策略模式 两篇博文中分析了策略模式的基础使用,在实际的项目开发中要结合spring容器使用策 ...

  2. 原来使用 Spring 实现策略模式可以这么简单!

    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,可以替代代码中大量的 if-else. 比如我们生活中的场景:买东西结账可以使用微信支付.支付宝支付或者银行 ...

  3. 策略模式、策略模式与Spring的碰撞

    策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...

  4. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  5. 如何使用 Spring 实现策略模式+工厂模式

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...

  6. 实践:使用Spring 原生注解来快速实现 策略模式 + 工厂模式

    作者:Richard_Yi juejin.im/post/5db0e910518825648f2ef355 前言 这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来, ...

  7. Spring 中策略模式的 2 个经典应用

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转自头条号程序汪汪 背景 程序员在项目实战中,策略模式用的非常多. 学习目标 会在Spring项目中运 ...

  8. spring AOP策略模式使用

    1.策略模式 The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inte ...

  9. Spring 中策略模式的 2 个经典应用,可以用来怼面试官了

    一.背景 程序员在项目实战中,策略模式用的非常多. 二.学习目标 会在Spring项目中运用策略模式 三.代码例子 废话不多说,Java的软件开发们注意啦,开车啦! 下面是一个查询业务使用策略模式的案 ...

最新文章

  1. HikariPool使用MySQL/MariaDB数据库报错解决:java.sql.SQLException: Access denied for user 'root'@'localhost' (u
  2. 什么是上采样和下采样
  3. 硬盘数据丢失,到底该如何修复?
  4. 移动端网页特效:左右滑动开关
  5. html怎样同框架页面内跳转,使用iframe框架时,实现子页面内跳转到整个页面,而不是在子页面内跳转...
  6. CString转char的方法总结
  7. 清北学堂模拟赛d6t2 刀塔
  8. 电子换向电动机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  9. vue常见知识点总结
  10. 自定义iOS UIPickerView
  11. ASIC 芯片 PVT
  12. 树莓派接3.5mm音响没有声音及音量调节
  13. 2022年中式面点师(中级)复训题库及模拟考试
  14. 什么蓝牙耳机性价比高?四款高品质蓝牙耳机测评
  15. 00-线段检测--FLD
  16. Python爬虫(4)网页信息
  17. 使用TeXpad iOS实现移动办公(二)
  18. 元宇宙,真的是人类的“死路”吗?
  19. [转载]“我做SLAM,那么论文该怎么发?”
  20. 安科瑞直流电能表DJSF1352的功能特点

热门文章

  1. 压缩机启动继电器市场现状研究分析与发展前景预测报告
  2. 元宇宙是人类未来的数字化生存,将对社会产生深远的影响
  3. 用机器学习识别不断变化的股市状况—隐马尔可夫模型(HMM)股票指数预测实战
  4. mysql自定义函数 PHP_MySQL自定义函数(CREATE FUNCTION)
  5. 电力系统中-输电、配电、变电、送电各代表什么意思
  6. PyCharm注释中出现中文运行报错
  7. android 已经依赖了某个库,但是还是会提示Cannot resolve symbol ‘xxx‘,运行却不会报错
  8. 穿墙无忧,大型物联网专属 Zigbee PRO 2017正式推出
  9. 关于我,一个程序员对过去的独白
  10. EventTrigger