写点什么

AdapterPattern- 适配器模式

作者:梁歪歪 ♚
  • 2022 年 5 月 29 日
  • 本文字数:1753 字

    阅读完需:约 6 分钟

AdapterPattern-适配器模式

适配器模式

适配器模式(Adapter Pattern):是指将一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作,适配器模式属于结构型设计模式。


示例登录功能随处可在,现在随着时代的发展,登录方式也是五花八门,但很多网站登录后的逻辑又是一样的,为了遵循开闭原则,不直接改变原有的登录逻辑,我们就需要使用适配器模式了。今天我们就通过登录来举例说明。


  • 原始的登录逻辑处理类LoginService.java


package cn.liangyy.adapter;
/** * 原始登录类 */public class LoginService { //为了方便理解,我们忽略注册功能,只考虑登录 public void login(String userName,String password){ System.out.println("登录成功,"+userName+" 欢迎您~"); }}
复制代码


  • 支持手机登录的类LoginByTelephone.java,继承原始的登录类


package cn.liangyy.adapter;
/** * 手机登录类 */public class LoginByTelephone extends LoginService { @Override public void login(String userName, String password) { super.login(userName, password); }
public void loginByTelephone(String telephone){ //处理业务逻辑,如注册,存储手机号,校验验证码等操作 //为了兼容之前的原始登录方式,可以初始化一个固定账户,密码 System.out.println("************手机登录************"); this.login(telephone,"设置好的密码"); }}
复制代码


  • 支持微信登录的类LoginByWechat.java,继承原始的登录类


package cn.liangyy.adapter;
/** * 微信登录 */public class LoginByWechat extends LoginService { @Override public void login(String userName, String password) { super.login(userName, password); }
public void loginByTelephone(String telephone){ //处理业务逻辑,如注册,存储手机号,校验验证码等操作 //为了兼容之前的原始登录方式,可以初始化一个固定账户,密码 System.out.println("************微信登录************"); this.login(telephone,"设置好的密码"); }}
复制代码


  • 支持 QQ 登录的类LoginByQQ.java,继承原始的登录类


package cn.liangyy.adapter;
/** * QQ登录 */public class LoginByQQ extends LoginService { @Override public void login(String userName, String password) { super.login(userName, password); }
public void loginByTelephone(String telephone){ //处理业务逻辑,如注册,存储手机号,校验验证码等操作 //为了兼容之前的原始登录方式,可以初始化一个固定账户,密码 System.out.println("************ QQ登录 ************"); this.login(telephone,"设置好的密码"); }}
复制代码


  • 测试类TestLoginAdapter.java


package cn.liangyy.adapter;
/** * 适配器模式-测试 */public class TestLoginAdapter { public static void main(String[] args) { //手机登录适配器 LoginByTelephone loginByTelephone = new LoginByTelephone(); loginByTelephone.loginByTelephone("电话号");
//微信登录适配器 LoginByWechat loginByWechat = new LoginByWechat(); loginByWechat.loginByTelephone("电话号/微信号");
//QQ登录适配器 LoginByQQ loginByQQ = new LoginByQQ(); loginByQQ.loginByTelephone("QQ号"); }}
复制代码


由以上例子可见,适配器模式的实现特别简单,就是通过简单的继承来实现的。下面放一个特别易懂的适配器例子


适配器模式适用场景


  • 针对已经存在的类,它的方法和需求不匹配的情况可以通过适配器来进行转换兼容。

  • 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,产生了许多功能类似而接口不相同情况下的一种解决方案。


适配器模式优点


  • 能提高类的透明性和复用,现有的类复用且不需要改变。

  • 目标类和适配器类的解耦提高程序的扩展性。

  • 扩展功能时通过新建类来实现,不需改动源码,符合开闭原则。


适配器模式缺点


  • 适配器过多时会降低代码阅读性,使得代码变得比较凌乱,难以阅读。

  • 适配器模式是通过继承来实现的,违背了合成复用原则。

发布于: 刚刚阅读数: 4
用户头像

梁歪歪 ♚

关注

还未添加个人签名 2021.07.22 加入

还未添加个人简介

评论

发布
暂无评论
AdapterPattern-适配器模式_设计模式_梁歪歪 ♚_InfoQ写作社区