百度工程师教你玩转设计模式(适配器模式)

2025-12-13 0 524

在现实生活中,经常会遇到两个 “对象” 因为接口不兼容而不能一起工作的场景,这时需要第三者进行适配,如:国内的充电线插头不一定适用国外的插座需要借助转接头、SD 卡无法直接链接电脑需要借助读卡器、用直流电的笔记本电脑接交流电源时需要一个电源适配器等。

在软件设计中,需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。

适配器模式 (Adapter Pattern):是指将某个类的接口转化成客户端期望的另一个接口,主要目的是兼容性,让原本因接口不匹配不能工作的两个类可以协同工作。

△适配器示意图

适配器模式包含如下角色:

  • Target:目标抽象类, 定义客户要使用的接口

  • Adapter:适配器类,将 Adaptee 的接口进行适配转换

  • Adaptee:适配者类,需要被转换接口的对象

  • Client:客户类,通过适配器接口 Target 去使用 Adaptee 的功能

△对象适配器

△类适配器

一、适配器模式在文档业务场景中的应用(对象适配器)

微软 office 文档有两种数据格式,即 office2007 (OOXML 格式) 和 Office2003 (二进制格式)。在新业务场景中,因现有系统已经具备 Office2007 文档处理功能组件(数据、阅读器等),现在需要在此基础上扩充支持 office2003 格式的文档。即复用现有的 office2007 组件类,但接口与复用环境要求不一致,此时可以使用适配器模式。

示例使用对象适配器方式,忽略业务处理细节,仅做流程上的抽象来表明适配器模式的使用,根据模式结构抽象出各个角色类:

  • Doc2003 目标抽象类

  • Doc2007 适配者类

  • DocAdapter 适配器类

  • Document 客户类

// Document客户类使用方 public class Document { public void View(Doc2003 doc) {
    doc.show()
  }
} // Doc2003接口抽象 public interface IDoc2003 { void show();
} // Doc2007适配者类 public class Doc2007 { public void show() {
        System.out.println(\"office2007标准处理流程\");
    }
} // DocAdapter适配器类 public class DocAdapter implements IDoc2003 { private Doc2007 doc2007; public DocAdapter(Doc2007 doc2007){ this.doc2007 = doc2007;
    } @Override public void show() {
        System.out.println(\"适配器:这里省略了适配到2007的一堆适配逻辑...\");
        doc2007.show();
    }
} // 测试类 public class Test { public static void main(String[] args) {
    Document document = new Document();
    Doc2003  doc2003 = new DocAdapter(new Doc2007()) ; 
    document.view(doc2003);
  }
}

二、适配器模式在替换依赖组件场景中的应用(类适配器)

在实际的研发过程中,我们经常会需要对依赖组件进行更新迭代。在替换时,相关调用代码,往往分布在非常多的地方,并且由于调用方法与参数不一致,逐个修改工作量大,且存在遗漏风险,这时候可以使用类适配器,将接口统一,减少相关代码的改动。

示例使用类适配器方式,忽略业务处理细节,仅做流程上的抽象来表明适配器模式的使用,根据模式结构抽象出各个角色类:

  • AHandler 目标抽象类

  • BHandler 适配者类

  • BAdapter 适配器类

  • Client 客户类

//原依赖库-目标抽象类 public class AHandler { public void operation() {}
} //新依赖库-适配者类 public class BHandler { public void action() {}
} //适配器类 public class BAdapter extends BHandler { public void operation() {
        ... super.action();
        ...
    }
} //客户类 public class Client { public static void main(String[] args) { //原调用 AHandler aHandler = new AHandler();
        aHandler.operation(); //新调用 BAdapter bAdapter = new BAdapter();
        bAdapter.operation();
    }
}

三、适配器模式在接口实现场景的应用(接口适配器)

在实际的开发过程中,一个接口有大量的方法,但是对应的不同类只需要关注部分方法,其他无关的方法全都实现过于繁琐,尤其是涉及的实现类过多的情况。

例如,现有一个需要的目标接口对象 Target,定义了大量相关的方法。但是在实际使用过程只需分别关注其中部分方法,而不是全部实现。在此场景中:

被依赖的目标对象:TargetObj

适配器:Adapter

客户端:Client

// 目标对象:定义了大量的相关方法 public interface TargetObj { void operation1(); void operation2(); void operation3(); void operation4(); void operation5();
} // 适配器:将目标接口定义的方法全部做默认实现 public abstract class Adapter implements TargetObj { void operation1(){} void operation2(){} void operation3(){} void operation4(){} void operation5(){}
} // 客户端:采用匿名内部类的方式实现需要的接口即可完成适配 public class Client { public static void main(String[] args) {
        Adapter adapter1 = new Adapter() { @Override public void operation3() { // 仅仅实现需要关注的方法即可 System.out.println(\"operation3\")
            }
        }
        
        Adapter adapter2 = new Adapter() { @Override public void operation5() { // 仅仅实现需要关注的方法即可 System.out.println(\"operation5\")
            }
        }
        
        adapter1.operation3();
        adapter2.operation5();

    }

}

四、总结

以上介绍了三种使用适配器模式的场景,适配器模式本质上是将现有的不兼容的接口转换为需要的接口,不需要改变原来的代码结构即可实现新的功能,通常实现方式上有:

  1. 对象适配器:通过对象的组合来达到适配目的;

  2. 类适配器:通过类的继承或者接口的实现来达到适配目的;

  3. 接口适配器:通过实现接口的方式转换来达到适配的目的;

适配器模式是在现有的类和系统都不易修改的情况下使用,在系统设计之初慎用适配器模式,这样会导致代码可读性变差,不易维护。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 百度工程师教你玩转设计模式(适配器模式) https://www.zuozi.net/36156.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务