当前位置: 首页 > news >正文

天津做网站公司哪家好广州小程序app定制开发

天津做网站公司哪家好,广州小程序app定制开发,做网站 商标分类,苏州网站排名优化价格优雅实现策略器模式 场景废话少说#xff0c;源码地址。讲解关于本文创建登陆策略创建环境#xff08;注册器#xff09;简化代码 创建父类对象#xff0c;也方便后期扩展 具体策略实现类用户名密码登陆手机号登陆 触发点调试简言 场景 登陆场景使用#xff08;登陆之后返… 优雅实现策略器模式 场景废话少说源码地址。讲解关于本文创建登陆策略创建环境注册器简化代码 创建父类对象也方便后期扩展 具体策略实现类用户名密码登陆手机号登陆 触发点调试简言 场景 登陆场景使用登陆之后返回用户信息和token所做操作基本一致杜绝多个判断 用户名密码登陆指纹登录手机号登陆 楼主之前写过一次通过注解实现的那个看起来没有注册器实现优雅。 策略器可以使用的场景很多主要为了杜绝多if判断把if判断需实现的信息放在自己的实现类中提升代码可阅读性提高执行效率降低出错概率。 八股文可扩展性高灵活性高代码复用性高单一职责原则可替换性高。 废话少说源码地址。 代码地址 git clone https://github.com/gwy572294624/strategy-demo-new 讲解 chatGpt关于策略模式的八股文 策略模式Strategy Pattern是一种行为型设计模式用于将不同的算法封装成独立的策略类并使这些策略类可以相互替换以实现在运行时动态地选择不同的算法。 在策略模式中有三个主要的角色 环境Context环境类是策略模式的核心其内部持有一个策略对象的引用。环境类将具体的任务委派给策略对象进行处理而不直接实现具体的算法逻辑。 策略Strategy策略类是一个接口或抽象类它定义了具体算法的方法。不同的策略类实现了不同的算法逻辑。策略类之间可以相互替换提供了算法的灵活配置。 具体策略Concrete Strategies具体策略类是策略模式的实现类实现了策略接口或抽象类中定义的具体算法逻辑。 策略模式的工作流程如下 客户端创建一个环境对象并通过构造函数或设置方法将具体的策略对象传递给环境对象。 客户端根据需求选择合适的策略对象。 环境对象在执行任务时会将具体的算法委派给当前持有的策略对象进行处理。 当需要切换算法时客户端可以动态地替换环境对象的策略对象实现不同的算法逻辑。 策略模式的优点包括灵活性、可替换性、可扩展性和代码复用性。它可以避免使用大量的条件语句或开关语句将不同的算法逻辑封装在独立的策略类中使系统更加灵活、易于扩展和维护。 关于本文 策略模式组成是通过环境策略具体实现三部分组成本文将环境context通过注册器实现实现自动化注入容器中维护起来更方便。主要用于优化系统中多if判断场景大一点的系统应该都能碰到所以希望可以帮助到大家。 创建登陆策略 public interface LoginStrategy {/*** 检查参数* return*/default Result checkParam(LoginPatamDTO loginPatamDTO){return Result.err();}/*** 登陆* param loginPatamDTO* return*/default ResultLoginUserInfoVO login(LoginPatamDTO loginPatamDTO){return Result.err();} } 创建环境注册器 将bean对象放在指定的map容器中。 Component public class LoginCommonStrategyRegistry {Autowiredprivate BeanFactory beanFactory;private MapLoginTypeEnum, LoginStrategy loginrCommonStrategyMap new ConcurrentHashMap();public MapLoginTypeEnum, LoginStrategy mapGet() {return this.loginrCommonStrategyMap;}/*** 初始化策略*/public void registry(LoginTypeEnum loginTypeEnum, Class glass) {LoginStrategy funderCommonStrategy (LoginStrategy)beanFactory.getBean(glass);this.loginrCommonStrategyMap.put(loginTypeEnum, funderCommonStrategy);} } 简化代码 创建父类对象也方便后期扩展 PostConstruct 是 Java 中的一个注解用于标记一个方法在对象创建之后通过构造函数创建并注入依赖后在依赖注入完成之后立即执行。它的作用是在对象初始化阶段执行一些必要的操作例如初始化资源、建立连接、加载数据等。 Service public abstract class AbstractLoginService implements LoginStrategy {private final LoginCommonStrategyRegistry loginCommonStrategyRegistry;public AbstractLoginService(LoginCommonStrategyRegistry loginCommonStrategyRegistry){this.loginCommonStrategyRegistry loginCommonStrategyRegistry;}/*** 注册当前类到策略map中*/PostConstructprotected abstract void initRegistry(); } 具体策略实现类 用户名密码登陆 Service Slf4j public class UserNameLoginService extends AbstractLoginService {public UserNameLoginService(LoginCommonStrategyRegistry loginCommonStrategyRegistry) {super(loginCommonStrategyRegistry);}Overrideprotected void initRegistry() {super.loginCommonStrategyRegistry.registry(LoginTypeEnum.USERNAME_TYPE, this.getClass());}Overridepublic Result checkParam(LoginPatamDTO loginPatamDTO) {if (ObjectUtils.isEmpty(loginPatamDTO.getUserName())) {return Result.err(用户名不能为空);}if (ObjectUtils.isEmpty(loginPatamDTO.getPassword())) {return Result.err(密码不能为空);}return Result.suc();}Overridepublic ResultLoginUserInfoVO login(LoginPatamDTO loginPatamDTO) {log.info(这里是用户名和密码登陆);if (loginPatamDTO.getUserName().equals(admin) loginPatamDTO.getPassword().equals(admin)) {// 创建默认对象 模拟登陆返回LoginUserInfoVO loginUserInfoVO LoginUserInfoVO.loginUserInfoVOCreate(loginPatamDTO.getLoginTypeEnum());return Result.suc(loginUserInfoVO);} else {return Result.err(用户名或者密码不正确);}} } 手机号登陆 Service Slf4j public class PhoneLoginService extends AbstractLoginService {public PhoneLoginService(LoginCommonStrategyRegistry loginCommonStrategyRegistry) {super(loginCommonStrategyRegistry);}Overrideprotected void initRegistry() {super.loginCommonStrategyRegistry.registry(LoginTypeEnum.PHONE_TYPE, this.getClass());}Overridepublic Result checkParam(LoginPatamDTO loginPatamDTO) {if (ObjectUtils.isEmpty(loginPatamDTO.getPhone())) {return Result.err(手机号不能为空);}if (ObjectUtils.isEmpty(loginPatamDTO.getSmsCode())) {return Result.err(验证码不能为空);}return Result.suc();}Overridepublic ResultLoginUserInfoVO login(LoginPatamDTO loginPatamDTO) {log.info(这里是手机号登陆);if (loginPatamDTO.getPhone().equals(17777777777) loginPatamDTO.getSmsCode().equals(7777)) {// 创建默认对象 模拟登陆返回LoginUserInfoVO loginUserInfoVO LoginUserInfoVO.loginUserInfoVOCreate(loginPatamDTO.getLoginTypeEnum());return Result.suc(loginUserInfoVO);} else {return Result.err(验证码不正确);}} } 触发点 如果没有写策略模式 那代码应该是这样 if(type.equals(用户名登陆)){// 用户名密码登陆验证 }else if(type.equals(手机号登陆)){// 手机号登陆 }else if(.......){.... }使用策略模式触发点确实简化了不少代码让代码优雅起来了。后续扩展啥的都很方便。 RestController public class LoginController {/*** 模拟redis*/public static MapString, String userInforedis new ConcurrentHashMap();private final LoginCommonStrategyRegistry loginCommonStrategyRegistry;public LoginController(LoginCommonStrategyRegistry loginCommonStrategyRegistry) {this.loginCommonStrategyRegistry loginCommonStrategyRegistry;}RequestMapping(value /a/login)public ResultLoginUserInfoVO login(LoginPatamDTO loginPatamDTO) {if (ObjectUtils.isEmpty(loginPatamDTO.getLoginTypeEnum())) {return Result.err(无效的登陆方式);}LoginStrategy loginStrategy loginCommonStrategyRegistry.mapGet().get(loginPatamDTO.getLoginTypeEnum());if (loginStrategy null) {return Result.err(无效的登陆方式);}Result result loginStrategy.checkParam(loginPatamDTO);if (result.getCode() 0) {return result;}ResultLoginUserInfoVO login loginStrategy.login(loginPatamDTO);if (login.getCode() 1) {userInforedis.put(login.getDate().getToken(), JSON.toJSONString(login.getDate()));}return login;}} 调试 http://127.0.0.1:8080/a/login?loginTypeEnumUSERNAME_TYPEuserNameadminpasswordadmin{code:1,msg:成功,date:{token:57a44abe-e731-40f1-a9f6-1069710ac6fa,userInfoBO:{userId:这个是id,userRealName:这个是名字,userSex:这个是性别,userDeptIds:这个是部门,loginTypeEnum:USERNAME_TYPE}}}简言 在接入策略模式前一定要想好调用交互逻辑如果系统有现成的最好使用现成的。当然也要避免循环依赖注入。 希望本文可以帮到大家。
http://www.zqtcl.cn/news/311568/

相关文章:

  • zencart 网站入侵冲电气软件 网站建设
  • 在网上做黑彩网站会怎样wordpress自定义代码在哪里设置
  • 福州营销网站建设老品牌网站开通
  • 电子商务网站体系结构有哪些?网站开发规划书怎么写
  • 建设一个网站要多少钱建设银行信用卡卡网站首页
  • 百度推广效果怎样seo网上培训课程
  • 广州品牌网站建设 优美wordpress 跳转页面
  • 成都专业的网站建设制作公司哪家好m3u8视频可以永久保存吗
  • 上海做兼职的网站如何在凡科建设网站
  • 沙朗镇做网站公司企业管理咨询师是干什么的
  • 起名网站建设商汇通网站
  • 网站开发费税率是多少钱建设小网站教程
  • 企业制作网站服务物联网应用有哪些
  • 中国建设网站银行个人做网站要注意什么条件
  • 莆田哪里有学做网站的wordpress可视化函数
  • 网站规划书500字上海金融网站制作网站制作公司好
  • 郑州网站制做钓鱼网站的公司
  • 网站域名授权怎么做以鹦鹉做头像的网站
  • 后端开发网站做一些什么WordPress能做门户网吗
  • 石家庄市住房和城乡建设厅网站好的企业型网站模板下载
  • 哈尔滨快速建站公司推荐网站刷流量会怎么样
  • 网站开发 顺德做新闻微网站有哪些
  • 如何阿里巴巴网站做推广苏州高新区建设局网站管网
  • 个人网站设计构思做汽车保养的网站
  • 在什么网站可以接国外的模具做中英文网站是怎么做的
  • 网站中的文字滑动怎么做的沈阳模板建站定制
  • 国内网站开发二手房网站开发背景
  • 电商网站建设与管理实践电商网站前端制作分工
  • 外贸公司怎么接订单网站编辑做seo好做吗
  • 科技企业网站建设珠海微信网站开发