现在的很多平台在登陆的时候,下面都会有一排选项,可以选择微信、QQ、微博账号等登陆,这些账号对平台来说都是第三方账号。第三方账号登陆是最近几年流行起来的,第三方账号登录一般都是基于OAuth2.0协议开发的。如果你不了解OAuth2.0协议,可以自行百度,也许会对你看这篇文章有所帮助。
现在由于公司要给平台引入流量,为了降低注册门槛,让更多的人来使用你们的平台,领导决定在你们的平台上接入第三方账号登陆功能。现阶段先接入微信、支付宝、QQ、GitHub 这四个第三方账号登陆。这个任务也顺利的落到你的头上,由于你了解OAuth2.0协议,你知道这个是一个固定的三段式操作,第一步获取Authorization Code,第二步获取Access Token,第三步调用信息接口,但是每个平台返回来的数据字段或者格式可能会不一样,所以你根据你的开发经验,为第三方账号登录模块抽取出来了一个IdentityProvider抽象类,该类主要有上面提到的三步需要的接口,IdentityProvider类的代码如下:
public abstract class IdentityProvider { // 获取Authorization Code abstract void authorizationCode(); // 获取 Access Token abstract void accessToken(); // 获取用户信息 abstract void getUserInfo(); }每一个第三方账号平台都继承IdentityProvider,根据每个第三方账号平台的规则去实现这三个接口,我们已支付宝为例,我们定义一个AliPayIdentityProvider类,该类继承了IdentityProvider类,AliPayIdentityProvider类代码如下:
/** * 支付宝 第三方登陆具体实现 */ public class AliPayIdentityProvider extends IdentityProvider{ private static final String APPID = "你申请的运用id"; private static final String APPKEY = "你的私钥"; public AliPayIdentityProvider() { System.out.println("我是支付宝第三方登陆具体实现"); } @Override abstract void getUserInfo(){ // 获取用户信息 } @Override public void authorizationCode() { //获取authorization Code } @Override public void accessToken() { //获取access Token } }四个第三方账号登录平台都按照上面的方式做了具体的实现,除此之外,你还创建了一个IdentityFactory类,该类是创建实例的唯一入口,里面提供了一个静态create方法,create方法的作用是根据传入的参数返回对应的第三方账号平台实例。IdentityFactory类代码如下:
public class IdentityFactory { /** * 第三方登陆实例获取 * @param type 标识符,1:支付宝登陆 2:微信登陆 3:QQ登录 4:github登陆 */ public static IdentityProvider create(int type){ IdentityProvider identityProvider = null; switch (type){ case 1: identityProvider = new AliPayIdentityProvider(); break; case 2: identityProvider = new WeChatIdentityProvider(); break; case 3: identityProvider = new QQIdentityProvider(); break; case 4: identityProvider = new GitHubIdentityProvider(); break; } return identityProvider; } }客户端调用时只需要调用create()方法即可以获取对应的实例,比如要使用GitHub账号登陆,我们只要调用IdentityProvider identityProvider = IdentityFactory.create(4);,获取到GitHub的IdentityProvider,获取到对象之后,可以进行GitHub账号登陆的具体操作。提交、部署、测试、上线,完美完成任务。
在第三方账号平台登陆功能的实现中,你使用到了一种设计模式,叫作简单工厂模式,此时你心里肯定大喊一声,卧槽,这就用上了设计模式?是的,没错,这就是设计模式。既然你好奇,那我们就一起来看看简单工厂模式。
简单工厂模式的定义简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,是创建型模式的一种。在简单工厂模式中,有一个工厂类来负责其他类的实例创建,这些被创建的实例类都有一个共同的父类,在我们的第三方账号登陆中AliPayIdentityProvider、WeChatIdentityProvider都是被实例化的类,它们都有一个共同的父类IdentityProvider,在简单工厂模式中,工厂类中可以根据传入的参数返回不同的实例,在我们的IdentityFactory类中,我们提供了一个静态的create(int type),可以根据传入的类型返回不同的实例。所以我们这个是标准的简单工厂模式的实例。
上面这一大段不好理解?没关系,那我们在抽象一下,简单工厂模式主要有以下三个成员:
抽象产品:抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口,例如IdentityProvider
具体产品:具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例,例如AliPayIdentityProvider
工厂类:负责实现创建所有实例的内部逻辑,例如IdentityFactory
我们再来看一下简单工厂模式的UML图: