本文转载自微信公众号《狼王编程》作者狼王本文转载请联系狼王编程公众号。一、概述适配器模式是一种结构化设计模式,可以使接口不兼容的对象相互协作。2、适用场景1)当你想使用某个类,但它的接口与其他代码不兼容时,可以使用一个适配器类。2)如果你需要使用这样的类,它们在同一个继承体系中,它们有一些额外的公共方法,但是这些公共方法并不是这个继承体系中的所有子类都公共的。这些方法可以包装在装饰器中。3.例子有以下场景:方钉装上圆孔的适配器,方钉要放在圆孔里,圆孔的直径等于钉子的对角线长度方钉。方钉适配圆孔适配器。如果方钉要放在圆孔内,则圆孔的直径等于方钉的对角线长度。定义方钉、圆孔圆孔:直径圆钉:直径方钉:边长.width=width;}/***边长*/privatedoublewidth;}定义圆钉:publicclassRoundNails{/***diameter*/privatedoublediameter;publicdoublegetDiameter(){returndiameter;}publicvoidsetDiameter(doublediameter){this.diameter=diameter;}publicRoundNails(doublediameter){this.diameter=diameter;}}定义圆孔:publicclassRoundHold{/***diameter*/privatedoublediameter;publicRoundHold(doublediameter){this.diameter=diameter;}publicdoublegetDiameter(){returndiameter;}publicvoidsetDiameter(doublediameter){this.diameter=diameter;}/***检查是否合适*@paramroundNails*@return*/publicbooleanfits(RoundNailsroundNails){if(diameter>=roundNails.getDiameter()){returntrue;}else{returnfalse;}}}定义适配器:publicclassSquareNailsRoundHoldAdapter{publicRoundNailsgetResult(SquareNailssquareNails){doublewidth=squareNails.getWidth();doublediagonal=width*Math.sqrt(2);RoundNailsroundNails=newRoundNails(diagonal);returnroundNails;}}测试类:@RunWith(SpringRunner.class)@SpringBootTest(classes=TestApplication.class)publicclassTestDemo{@Testpublicvoidtest(){//定义圆孔RoundHoldroundHold=newRoundHold(10);//DefineroundnailsRoundNailsroundNails=newRoundNails(10);//Definesquarenails,margin10SquareNailssquareNails10=newSquareNails(10);//Definesquarenails,margin6SquareNailssquareNails6=newSquareNails(6);//AdapterSquareNailsRoundHoldAdaptersquareHoldNailsRoundnewSquareNailsRoundHoldAdapter();RoundNailsresult10=squareNailsRoundHoldAdapter.getResult(squareNails10);RoundNailsresult6=squareNailsRoundHoldAdapter.getResult(squareNails6);//圆钉是否贴合if(roundHold.fits(roundNails)){"System.out.printlnails);fits("thisrelse{System.out.println("thisroundnailsisdoesnotfits");}//If(roundHold.fits(result10)){System.out.println("squareNails10isfits");}else{System.out.println("squareNails10isdoesnotfits");}//6是否正方形如果(roundHold.fits(result6)){System.out.println("squareNails6isfits");}else{System.out.println("squareNails6isdoesnotfits");}}}结果:thisroundnailsisfitssquareNails10isdoesnotfitssquareNails6isfits4。优点总结:1)单一原则:转换代码或数据流程与主要业务逻辑分离2)开闭原则:只要客户端代码通过客户端接口与适配器进行交互,就可以添加新的类型在不修改现有客户端代码的情况下适配程序。缺点:增加代码复杂度。使用时需要考虑修改原有功能是否更容易。
