当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-02 01:49:46 Java

作者|PolarisTeam在现实生活中,我们经常会遇到两个“物体”因为接口不兼容而无法协同工作,需要第三方适配的场景,比如:国内的充电线插头可能不适合国外的插座需要使用适配器,SD卡不能直接连接电脑需要使用读卡器,直流电源的笔记本电脑连接交流电源需要电源适配器等。组件库,但不兼容当前系统的接口规范。如果重新开发这些组件的成本很高,那么使用适配器模式可以很好地解决这些问题。AdapterPattern:是指将某个类的接口转换为客户端所期望的另一个接口。主要目的是兼容性,让两个因接口不匹配而无法工作的类可以一起工作。△Adapter示意图适配器模式包括以下角色:Target:目标抽象类,定义了客户要使用的接口Adapter:适配器类,对Adaptee的接口进行适配转换Adaptee:适配器类,要转换的对象到接口Client:customer类,通过适配器接口Target来使用Adaptee△ObjectAdapter△ClassAdapter的功能1.适配器模式在文档业务场景中的应用(对象适配器)Microsoftoffice文档有两种数据格式,分别是office2007(OOXML格式)和Office2003(二进制格式)。在新的业务场景下,由于现有系统已有Office2007文档处理功能组件(数据、阅读器等),现在需要在此基础上扩展对office2003格式文档的支持。即复用已有的office2007组件类,但是接口不符合复用环境的要求,此时可以使用适配器模式。例子使用对象适配器方式,忽略业务处理的细节,只抽象流程来说明使用适配器模式,按照模式结构抽象出各个角色类:Doc2003目标抽象类Doc2007适配器类DocAdapter适配器类Documentclientclass//DocumentclientclassuserpublicclassDocument{publicvoidView(Doc2003doc){doc.show()}}//Doc2003接口抽象publicinterfaceIDoc2003{voidshow();}//Doc2007适配器??类publicclassDoc2007{publicvoidshow(){System.out.println("office2007标准处理流程");}}//DocAdapter适配器类publicclassDocAdapterimplementsIDoc2003{privateDoc2007doc2007;publicDocAdapter(Doc2007doc2007){this.doc2007=doc2007;}@Overridepublicvoidshow(){System.out.println("适配器:这里省略了一堆适配2007的适配逻辑...");doc2007.show();}}//测试类publicclassTest{publicstaticvoidmain(String[]args){Documentdocument=newDocument();Doc2003doc2003=newDocAdapter(newDoc2007());文件.view(doc2003);}}二、适配器模式正在替代依赖组件场景下的应用(类适配器)在实际开发过程中,我们经常需要对依赖组件进行更新和迭代。替换时,相关调用代码往往分布在多处,而且由于调用方式与参数不一致,逐一修改工作量大,存在遗漏风险。这时候可以使用类适配器来统一接口,减少相关代码。改变。示例使用类适配器方法,忽略业务处理的细节,只抽象流程表示使用适配器模式,按照模式结构抽象出各个角色类:AHandler目标抽象类BHandler适配器类BAdapter适配器类Clientclientclass//原依赖库-targetabstractclasspublicclassAHandler{publicvoidoperation(){}}//新建依赖库-adapterclasspublicclassBHandler{publicvoidaction(){}}//适配器类publicclassBAdapterextendsBHandler{publicvoidoperation(){...super.action();...}}//CustomerclasspublicclassClient{publicstaticvoidmain(String[]args){//原始调用AHandleraHandler=newAHandler();aHandler.operation();//新调用BAdapterbAdapter=newBAdapter();bAdapter.operation();接口有大量的方法,但是对应的不同的类只需要关注一些方法,其他不相关的方法的实现太麻烦了,尤其是涉及到的实现类太多的时候。比如有一个必需的目标接口对象Target,它定义了大量的相关方法。但在实际使用过程中,只需要注意其中的一些方法,而不是全部。在这个场景中:依赖目标对象:TargetObjAdapter:AdapterClient:Client//目标对象:定义了大量相关方法publicinterfaceTargetObj{voidoperation1();无效操作2();无效操作3();无效操作4();voidoperation5();}//Adapter:默认实现目标接口定义的所有方法publicabstractclassAdapterimplementsTargetObj{voidoperation1(){}voidoperation2(){}voidoperation3(){}voidoperation4(){}voidoperation5(){}}//Client:使用匿名内部类实现所需接口完成适配publicclassClient{publicstaticvoidmain(String[]args){Adapteradapter1=newAdapter(){@Overridepublicvoidoperation3(){//只实现需要注意的方法System.out.println("operation3")}}Adapteradapter2=newAdapter(){@Overridepublicvoidoperation5(){//只实现需要注意的方法需要注意System.out.println("operation5")}}adapter1.operation3();适配器2.operation5();}}4.小结上面介绍了三种适配器模式的使用场景。适配器模式本质上是在不改变原有代码结构的情况下,将现有的不兼容接口转换为需要的接口。实现新功能,通常有实现方法:对象适配器:通过对象的组合来达到适配的目的;类适配器:通过类的继承或接口的实现来达到适配的目的;接口适配器:通过实现接口来实现转换,达到适配的目的;适配器模式在已有的类和系统不易修改时使用,在系统设计之初应慎用适配器模式,会导致代码可读性差,维护困难-----------END------------推荐阅读【技术加油站】系列:揭秘百度智能测试测评领域实践百度工程师带你从头探索C++内存管理(理论)了解APP测速百度工程师教你玩转设计模式(工厂模式)揭开百度智能测试的秘密测试分析领域实践百度用户实时数据仓库实战产品流批一体化