介绍
标准定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
通俗理解:我们日常用的读卡器就是一个适配器,内存卡不能直接插入笔记本,需要将内存卡先插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
案例
场景:有一个老系统运行了很久,目前十分稳定,不便再去修改里面的代码。但是为了兼容新的需求或标准,我们不得不对老系统再去做一些文章(向下兼容),那怎么去保证满足新需求的同时,又能够让老系统继续稳定呢?这里采用适配器模式,拿用户的登录注册为例,以前的老系统只能是用户名密码登录,而现在需要满足第三方QQ、微信登录。
代码:
1》老系统的登录注册类
public class SignService {
/**
* 用户注册
* @param username
* @param password
* @return
*/
public ResultMsg register(String username,String password){
return new ResultMsg("200","注册成功",new User());
}
/**
* 用户登录
* @param username
* @param password
* @return
*/
public ResultMsg login(String username,String password){
return new ResultMsg("200","登录成功",new User());
}
}
2》新系统的登录注册类,继承老系统的登录注册类
public class SignForThirdService extends SignService {
//第三方QQ登录
public ResultMsg loginForQQ(String openid){
//1.openid是全局唯一的,我们可以把它当成是一个用户名
//2.密码默认为taofut_xxx,这个只有我们内部开发人员知道
//3.注册(在原有的系统里注册一个用户)
//4.调用原来的登录方法
return loginForRegist(openid,"taofut_xxx");
}
//第三方微信登录
public ResultMsg loginWechat(String openid){
return null;
}
//拿到token重新登录
public ResultMsg loginForToken(String token){
return null;
}
//手机号+验证码登录
public ResultMsg loginForTel(String tel,String code){
return null;
}
//注册并登录
public ResultMsg loginForRegist(String username,String password){
//调用原来的注册方法
super.register(username,password);
//调用原来的登录方法
return super.login(username,password);
}
}
3》用户信息类
public class User {
private String username;
private String password;
private String uid;
private String info;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
4》登录注册返回结果类
public class ResultMsg {
private String code;
private String msg;
private Object data;
public ResultMsg(String code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
5》测试类
public class AdapterTest {
public static void main(String[] args) {
SignForThirdService signForThirdService=new SignForThirdService();
//不改变原来的代码,也要兼容新的需求
signForThirdService.loginForQQ("ddssss123ddsdsddsdsd");
}
}
总结:以上这个例子就是采用适配器模式,既要保证老系统原来的稳定性,又要满足现有的需求。原来老系统的登录注册方法不能改,那么我们就用一个新的登录注册类去继承原有的登录注册类,在调用第三方QQ登录接口的同时,把openid当成一个用户名,调用原来的注册方法,密码内部自己定义一个,创建一个新的用户。然后再调用原来的登录方法,将新用户的用户名密码传过去完成登录。这里,只是调用了老系统的登录注册方法,而没去改变它的代码,稳定性保证了,也实现了第三方登录。适配器模式往往是一种兼容思想。