适配器模式
- 什么是适配器模式
- 适配器模式示例
- 适配器模式适用场景
- 适配器模式优点
- 适配器模式缺点
什么是适配器模式
适配器模式(Adapter Pattern)是指将一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作,属于结构型设计模式。
登录是一个非常常用的功能,在最原始的web网站一般都是通过账号密码登录,但是随着通讯软件的发展,现在的登录都需要支持手机登录,或者是qq,微信,微博等第三方快捷登录,但是不管选择什么登录,登录之后的处理逻辑肯定是一样的,所以为了遵循软件的开闭原则,我们不能直接改变原有的登录逻辑,这时候适配器模式就派上用场了。下面就让我们通过一个登录的示例来看看适配器模式是怎么落地的吧。
适配器模式示例
新建一个原有的登录类:
package com.zwx.design.pattern.adapter;
public class LoginService {
//为了便于理解,我们忽略账号注册功能,只考虑登录功能
public void login(String userName,String password){
System.out.println("登录成功,欢迎您" + userName);
}
}
然后现在我们需要兼容微信和手机号登录:
新建一个第三方登录类,继承原有登录类LoginService:
package com.zwx.design.pattern.adapter;
public class LoginByOtherModeService extends LoginService {
public void loginByWechat(String openid){
//处理业务逻辑,如注册,存储微信账号信息等
//为了兼容之前的账号密码登录,可以初始化与一个固定一个账号,并设置密码
this.login(openid,"设置好的密码");
}
public void loginByTelephone(String telephone){
//处理业务逻辑,如注册,存储手机号校验验证码等
//为了兼容之前的账号密码登录,可以初始化与一个固定一个账号,并设置密码
this.login(telephone,"设置好的密码");
}
@Override
public void login(String userName, String password) {
super.login(userName, password);
}
}
主要的思想就是先实现自己的特有逻辑,然后再回调原有的登录方法。
最后新建一个测试类测试:
package com.zwx.design.pattern.adapter;
public class TestLoginAdapter {
public static void main(String[] args) {
LoginByOtherModeService loginByOtherModeService = new LoginByOtherModeService();
loginByOtherModeService.loginByTelephone("131xxxxxxxx");
loginByOtherModeService.loginByWechat("openid");
}
}
输出结果为:
登录成功,欢迎您131xxxxxxxx
登录成功,欢迎您openid
适配器模式的实现特别简单,就是通过继承来实现的。当然,上面的实现是简化了,如果有必要的话可以每一种登录都单独一个类,并且可以通过简单工厂的配合使用来决定使用哪种登录方式。
适配器模式适用场景
- 1、针对已经存在的类,它的方法和需求不匹配(方法结果相同或相似) 的情况。
- 2、适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,产生了许多功能类似而接口不相同情况下的一种解决方案。
适配器模式优点
- 1、能提高类的透明性和复用,现有的类复用但不需要改变。
- 2、目标类和适配器类解耦,提高程序的扩展性。
- 3、在很多业务场景中符合开闭原则。
适配器模式缺点
- 1、适配器编写过程需要全面考虑,可能会增加系统的复杂性。
- 2、增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。