1. 适配器模式的结构和说明
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2. 适配器模式的结构和说明
类的适配器模式(采用继承实现)
对象适配器(采用对象组合方式实现)
- Client:客户端,调用自己需要领域的接口
- Target:定义客户端需要的跟特定领域有关的接口
- Adaptee:已经存在的接口,通常能满足客户端的功能需求,但是接口与客户端需要的特定领域接口不一致,需要被适配。
- Adapter:适配器,把Adaptee适配成为Client需要的Target。
3. 实例
下面以用户注册,登录为例进行讲解 现在有一个比较稳定的LoginService(被代理对象) 有注册和登录两个比较稳定功能注册和登录,注册和登录都是需要传入用户名和密码。现在由于需求变更需要添加第三方登录(包括QQ,微信)ThridLoginService(Target)第三方登录一般都是传入第三方的openId来进行登录的。有人可能会说在LoginService 加一个方面不就行啦!其实可以加一个方法,但是如果这个稳定的LoginService是其他项目组开发的,我们没有办法修改又想复用其中的方法怎么办呢!用适配器模式就可以解决上面的问题。下面的实例以对象适配器(采用对象组合方式)实现。
LoginService
/**
* 稳定的注册和登录
*
* @author lijun
* @since 2018-03-20 15:35
*/
public class LoginService {
/**
* 注册方法
*
* @param username 用户名
* @param password 密码
* @return
*/
public void regist(String username, String password) {
System.out.println("恭喜你注册成功!");
}
/**
* 登录的方法
*
* @param username 用户名
* @param password 密码
* @return
*/
public void login(String username, String password) {
System.out.println("恭喜你登录成功!");
}
}
ThridLoginService
/**
* 第三方登录
*
* @author lijun
* @since 2018-03-20 15:42
*/
public interface ThridLoginService {
/**
* 第三方登录
*
* @param openId 第三方openid
*/
public void loginThrid(String openId);
}
LoginForQQAdapter
/**
* QQ登录适配
* @author lijun
* @since 2018-03-20 15:54
*/
public class LoginForQQAdapter implements ThridLoginService {
LoginService loginService;
public LoginForQQAdapter(LoginService loginService) {
this.loginService = loginService;
}
/**
* 第三方登录
*
* @param openId 第三方openid
*/
@Override
public void loginThrid(String openId) {
System.out.println("QQ 注册登录");
loginService.regist(openId, null);
loginService.login(openId, null);
}
}
LoginForWechatAdapter
/**
* 微信登录适配
*
* @author lijun
* @since 2018-03-20 15:54
*/
public class LoginForWechatAdapter implements ThridLoginService {
/**
* 被适配的对象
*/
LoginService loginService;
/**
* 构造方法
*
* @param loginService loginService
*/
public LoginForWechatAdapter(LoginService loginService) {
this.loginService = loginService;
}
/**
* 第三方登录
*
* @param openId 第三方openid
*/
@Override
public void loginThrid(String openId) {
System.out.println("微信 注册登录");
loginService.regist(openId, null);
loginService.login(openId, null);
}
}
调用(Client)
@Test
public void testObject() {
//QQ
ThridLoginService loginForQQAdapter = new LoginForQQAdapter(new LoginService());
loginForQQAdapter.loginThrid("MMMMXXXXXXX");
//微信
ThridLoginService loginForWechatAdapter = new LoginForWechatAdapter(new LoginService());
loginForWechatAdapter.loginThrid("MMMMXXXXXXX");
}
输出
QQ 注册登录
恭喜你注册成功!
恭喜你登录成功!
微信 注册登录
恭喜你注册成功!
恭喜你登录成功!
4. 本质
转换匹配,复用功能
类的适配器模式的实现可以查看源码,这里不再贴代码!。
源码地址