【设计模式】适配器模式——登录案例

系列文章目录

【设计模式】策略模式——支付案例
【设计模式】模板模式——jdbc案例
【设计模式】委派模式——登录案例


前言

有的手机没有耳机插口,如果想使用圆形插口的耳机,就需要通过一个转接头进行适配。适配器模式就是这样的一个作用,作为两个不兼容的接口之间的桥梁。映射到代码中,可以想到登录,现在的登录方式有很多种,账号密码登录,短信登录,还有很多第三方登录(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的判断呢?那么可不可以引入策略模式呢?
设计模式是根据场景来灵活的运用,杜绝为了使用设计模式而是用设计模式。要学会后发制人,化有行为无形,无论怎么写,代码最终讲究的是优雅、灵活。