⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/qq_30285985/article/details/108641817 「叁滴水」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

前言

有的手机没有耳机插口,如果想使用圆形插口的耳机,就需要通过一个转接头进行适配。适配器模式就是这样的一个作用,作为两个不兼容的接口之间的桥梁。

映射到代码中,可以想到登录,现在的登录方式有很多种,账号密码登录,短信登录,还有很多第三方登录(qq登录,微信登录)等等。每一种登录接收的参数都不一样(插口不一样)。

一、代码示例

1.账号密码登录

假如项目刚刚开发,只有一个账号密码登录

代码如下(示例):传入账号密码,判断是否正确,之后设置各种日志信息,设置session等等。

public class LoginService {

// 账号密码登录
public void login(UserInfo user){
System.out.println("账号密码登录");
UserInfo userInfo = userMapper.getUserInfo(user.getUserName(),user.getPassword());
// 设置登录日志
// 设置session
// 等等各种操作此处省略
}
}

2.短信登录

假如有一天,产品大大要加入短信登录,短信登录只有手机号和验证码。

代码如下(示例):创建SmsLoginService

public class SmsLoginService extends LoginService {
//手机号
//验证码
@Override
public void login(UserInfo user){
System.out.println("短信登录");
//验证验证码是否正确
this.checkCode(user.getMobile(),user.getCode());

UserInfo userInfo = this.userMapper.getUserInfo(user.getMobile());
super.login(userInfo);
}
}

短信登录service继承LoginService,重写login方法,然后转换成账号密码登录需要的参数信息进行登录。

3.微信登录

代码如下(账号密码登录):

public class WechatLoginService extends LoginService {
//微信登录
// user中只有openId
@Override
public void login(UserInfo user){
System.out.println("微信登录");
//通过openId 获取用户信息
UserInfo userInfo = userMapper.getUserInfo(user.getOpenId());
super.login(userInfo);
}
}

同理,微信登录也可以继承LoginServie,重写login方法转换成账号密码登录需要的参数,来进行适配。

public class UserInfo {
private Long id;
private String userName;
private String password;
private String mobile;
private String openId;// 线上可能一个人多个openId
private String code;
}

这种写法,确实简化了部分代码,但是总感觉有一点点的牵强,因为实际情况中,经常会多个设计模式一起使用。

比如登录的时候可以分为 验证用户信息,生成用户凭证,记录日志,3个步骤。这个时候就可以引入模板模式来固定流程的执行顺序。

或者说在进行选择某一种登录的时候,会不会出现多个if/else的判断呢?那么可不可以引入策略模式呢?

设计模式是根据场景来灵活的运用,杜绝为了使用设计模式而是用设计模式。要学会后发制人,化有行为无形,无论怎么写,代码最终讲究的是优雅、灵活。

文章目录
  1. 1. 前言
  2. 2. 一、代码示例
    1. 2.1. 1.账号密码登录
    2. 2.2. 2.短信登录
    3. 2.3. 3.微信登录