一个登录案例,学会适配器设计模式!
共 3373字,需浏览 7分钟
·
2021-03-14 14:41
点击关注公众号,Java干货及时送达
作者:叁滴水
博客:https://blog.csdn.net/qq_30285985/
前言
有的手机没有耳机插口,如果想使用圆形插口的耳机,就需要通过一个转接头进行适配。适配器模式就是这样的一个作用,作为两个不兼容的接口之间的桥梁。
映射到代码中,可以想到登录,现在的登录方式有很多种,账号密码登录,短信登录,还有很多第三方登录(qq登录,微信登录)等等。每一种登录接收的参数都不一样(插口不一样)。
![](https://filescdn.proginn.com/3fa01741705e14bf1d3fcb16a69987e0/d1d95b9f2b0daf937be23db90122a200.webp)
一、代码示例
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方法,然后转换成账号密码登录需要的参数信息进行登录。另外,关注公众号Java技术栈,在后台回复:设计模式,可以获取我整理的 Java 设计模式系列教程,不断更新中。
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的判断呢?那么可不可以引入策略模式呢?
设计模式是根据场景来灵活的运用,杜绝为了使用设计模式而是用设计模式。要学会后发制人,化有行为无形,无论怎么写,代码最终讲究的是优雅、灵活。
另外,想学习更多的策略模式,可以关注公众号Java技术栈,在后台回复:设计模式,可以获取我整理的设计模式教程,都是实战干货。
本文来自作者「叁滴水」投稿,谢谢分享,也欢迎爱好技术分享的各位技术朋友向「Java技术栈」投稿,让更多人看到,投稿方式:关注公众号「Java技术栈」在后台回复:投稿。
![](https://filescdn.proginn.com/32d135cb7384e715783e13f4129a73db/8ad28b493e62ba709e1fa7593d2a69de.webp)
![](https://filescdn.proginn.com/ab9c9f864504409319aea39b2be7bc1e/03b987575b8b3364aab5feed8560c4f8.webp)
![](https://filescdn.proginn.com/769a52ab2553e758ccab780e6ce9d7dd/cb638e125e2cc9e7353dcfe5d2304884.webp)
![](https://filescdn.proginn.com/32d135cb7384e715783e13f4129a73db/3bcb9a3ccc4a830584266598493ec893.webp)
![](https://filescdn.proginn.com/fda04f7e57257a5722987458ff25b21e/9efb741677d042a82db719d14b826482.webp)
关注Java技术栈看更多干货
![](https://filescdn.proginn.com/e1348ac1a1a9078ba3c965f6a3dc84d3/809823164bd66ef652fac4510a0672fc.webp)