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

设计模式【6.1】——适配器模式初探

时间:2023-04-01 18:15:31 Java

设计模式文章合集:http://aphysia.cn/categories/...一张图开始,剩下的靠写...简介AdapterPatterns(百度百科):在计算机编程中,适配器模式(有时也称为包装样式或包装)使类的接口适应用户的期望。适配器通过将类自己的接口包装在现有类中,允许通常因接口不兼容而无法一起工作的类一起工作。适配器模式的主要目的是为了兼容性,让两个不匹配的类或接口可以协同工作。属于结构模式,主要分为类适配器、对象适配器、接口适配器三种。适配器模式更灵活,可以提高复用性,但如果滥用,系统调用关系会更复杂,每一次适配本质上都是一种妥协。不断妥协,最终迎来的一定是重构。适配器模式类型类适配器说明:适配器类(Adapter),通过继承原类,在实现目标接口的同时,完成的功能是拥有原类的属性方法,同时目标接口可以是叫。例子:原来一个充电器(目标类)可以给iPhone充电,另一个充电器(接口)可以给Android手机充电。我们想实现一个适配器,让iPhone充电器具备安卓充电器的功能。代码结构如下:AndroidCharger.class://充电接口androidpublicinterfaceAndroidCharger{publicvoidandroidout();}AppleCharger.class//苹果充电类.println("我是充电器,我可以给苹果充电...");}}ChagerAdapater.class//充电适配器publicclassChagerAdapaterextendsAppleChargerimplementsAndroidCharger{@Overridepublicvoidandroidout(){iphoenOut();系统。out.println("适配器开始工作----");System.out.print("我有给安卓充电的能力");}}Test.classpublicclassTest{publicstaticvoidmain(String[]args){ChagerAdapaterchagerAdapater=newChagerAdapater();chagerAdapater.androidout();}}运行结果如下:个人理解:这里之所以一个继承一个接口,是因为java只能继承单继承。适配多个类,只能继承一个,另一个用接口实现,有一定的局限性。重写其方法也更加灵活,接口方法可以修改。2.个人对对象适配器的理解:上述类适配器都是通过继承和实现接口实现的(被继承的父类和接口都是一个类),而对象适配器是基于“合成复用原则”的,没有使用继承而是使用关联关系,直接把另一个类的对象当作成员对象,也就是持有之前需要继承的类的一个实例。代码结构没有变,只是重新创建了一个包:ChangedChagerAdapater.class//充电适配器publicclassChagerAdapaterimplementsAndroidCharger{//持有一个苹果充电器的实例privateAppleChargerappleCharger;//构造函数publicChagerAdapater(AppleChargerappleCharger){this.appleCharger=appleCharger;}@Overridepublicvoidandroidout(){System.out.println("适配器开始工作----");System.out.print("我有给安卓充电的能力");}}改变了Test.classpublicclassTest{publicstaticvoidmain(String[]args){ChagerAdapaterchagerAdapater=newChagerAdapater(newAppleCharger());chagerAdapater.androidout();理解:这个在思路上和第一类适配器类似,只是实现方式不同。类适配器通过继承类实现接口,对象适配器将要继承的类转换为属性对象,并将实例与适配器相关联。也就是说,适配器类持有原始父类的对象实例。一般来说,由于java是单继承的,所以这次我们尽量不要浪费使用继承的机会,而且这样写也比较灵活。3.接口适配器接口适配器也可以称为默认适配器模式,或默认适配器模式。当我们不需要实现接口实现的所有方法时,我们可以设计一个抽象类来实现接口,然后在这个抽象类中为所有方法提供一个默认实现,这个抽象类的子类可以选择性的实现该方法已实现。代码结构如下:说明:student类可以吃和学,但是teacher类也可以吃,但是teacher不是在学,而是在教,所以我们把learning,eating,teaching作为接口的方法,因为并不是所有的类都需要实现所有的Interface,我们在中间实现一个抽象类来实现这些接口,所有的方法都提供一个默认的实现方法。然后学生类或者教师类继承这个抽象类,从而实现自己需要的一些方法。myInterface.class//接口定义方法publicinterfacemyInterface{//学习接口方法publicvoidstudy();//教学接口方法publicvoidteach();//吃的接口方法publicvoideat();}myAbstractClass.class(abstractclass)publicabstractclassmyAbstractClassimplementsmyInterface{//学习的接口方法@Overridepublicvoidstudy(){}@Override//吃的接口方法publicvoideat(){}//教学接口方法@Overridepublicvoidteach(){}}Student.class(学生班)publicclassStudentextendsmyAbstractClass{//学习接口方法@Overridepublicvoidstudy(){System.out.println("我是学生,我要好好学习");}@Override//吃饭接口方法publicvoideat(){System.out.println("我是学生,我要吃饭");}}Teacher.class(教师类)publicclassTeacherextendsmyAbstractClass{@Override//吃接口方法publicvoideat(){System.out.println("我是老师,我要吃饭");}//教学接口方法@Overridepublicvoidteach(){System.out.println("我是老师,我要育出祖国的花朵");}}Test.calss(testclass)publicclassTest{publicstaticvoidmain(String[]args){Student学生=new学生();老师teacher=newTeacher();学生吃();学生.study();老师.吃();teacher.teach();}}运行结果:4.总结1.ClassAdapter模式主要是通过继承目标类来实现要添加的接口方法,然后适配类和接口一起工作。而是直接使用成员变量等方法来保存目标类的对象,然后实现要添加的接口方法,达到同样的目的。3.接口适配器模式是把所有的方法定义成一个接口,然后创建一个抽象类来实现所有的方法,然后用真正的类继承这个抽象类,只需要重写需要的方法,就可以完成适配匹配函数。有兴趣的可以了解适配器模式的另一种说法[https://blog.csdn.net/Aphysia...]4.建议尽量使用对象适配器模式,少用遗产。适配器模式也是一种包装模式,与装饰模式具有相同的包装功能。另外,对象适配器模式还有委托的意思。一般来说,适配器模式属于补偿模式,专门用于后期系统的扩展和修改,但注意不要过度使用适配器模式。【作者简介】:公众号【秦淮杂货铺】作者秦淮,技术之路不是一时的,山高水长,纵使慢也不会停。个人写作方向:Java源码分析、JDBC、Mybatis、Spring、redis、分布式、简知Offer、LeetCode等,认真写好每篇文章,不喜欢头条党,不喜欢花里胡哨,多写系列的文章,不保证我写的是完全正确的,但我保证我写的是经过实践或搜索过的资料。如有遗漏或错误,敬请指正。剑指提供所有问答PDF2020年我写了什么?开源编程笔记关注公众号“秦淮杂货铺”领取剑指OfferV1版PDF解法,V2版增加题型,还在持续更新中,每道题增加C++题型,敬请期待。