如果下载的源码需要作者授权,请更换源码。

本站免费分享资源不会增加授权

本篇文章给大家带来的内容是Java中适配器模式(Adapter)是什么?

适配器模式(详解)。

有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。

目的:把源类型适配为目标类型,以适应客户端(Client)的需求;此处我们把目标接口的调用方视为客户端

使用场景:需要对类型进行由源类型到目标类型转换的场景中

前置条件:已有客户端

//Client一个调用目标接口的方法ClassClientInvoking{staticvoidinvoke(TargetInterfacetarget){Stringvalue=target。

getMark();System。

out。

println(value);}}

常用的几种模式

模式一:存在目标接口,且存在已有方法

//目标接口publicinterfaceTargetInterface{publicStringgetMark();publicStringgetInfo();}

//已有类及方法publicclassExistClass{publicStringsayHello(){returnHello}publicStringsayWorld(){returnWorld}}

我们假设ExistClass返回的字符串正好是我们的客户端需要用到的,但客户端需要的是通过一个TargetInterface类型的对象来获取,因此我们需要想办法对已有类进行适配,使其能够满足客户端的需求;该模式下存在两种应用方案:

方案1。

类适配器模式

//适配器publicclassClassAdapterextendsExistClassimplementsTargetInterface{publicintgetMark(){Stringvalue=this。

sayHello();returnvalue;}publicintgetInfo(){Stringvalue=this。

sayWorld();returnvalue;}}

//客户端调用TargetInterfacetarget=newClassAdapter();ClientInvoking。

invoke(target);

由Java接口的概念可知,ClassAdapter作为TargetInterface的实现类,能够向上转型为TargetInterface类型,适应了客户端的需求。

方案2。

对象适配器模式

//适配器publicclassClassAdapterimplementsTargetInterface{privateExistClassexist;publicClassAdapter(ExistClassexistClass){this。

exist=existClass;}publicintgetMark(){Stringvalue=exist。

sayHello();returnvalue;}publicintgetInfo(){Stringvalue=exist。

sayWorld();returnvalue;}}

//客户端调用TargetInterfacetarget=newClassAdapter(newExistClass());ClientInvoking。

invoke(target);

该方案与类适配器模式类似,只是不采用继承而采用持有对象的方式,更加灵活,扩展性更强。

模式二:不存在目标接口,但是存在目标类,且存在已有方法

我们先对前置条件中的客户端进行改造,如下:

ClassClientInvoking{staticvoidinvoke(TargetClasstarget){Stringvalue=target。

getMark();System。

out。

println(value);}}

改造后,invoke方法需要一个TargetClass类的对象作为参数;下面是目标类和已有类

//目标类publicclassClass{publicStringgetMark(){returnyes}publicStringgetInfo(){returnno}}

//已有类及方法publicclassExistClass{publicStringsayHello(){returnHello}publicStringsayWorld(){returnWorld}}

我们假设ExistClass返回的字符串正好是我们的客户端需要用到的,且客户端中需要的TargetClass对象的内容已经过时,因此我们需要相办法对ExistClass进行适配,以适应客户端的需求;

//适配器publicclassClassAdapterextendsTargetClass{privateExistClassexist;publicClassAdapter(ExistClassexistClass){this。

exist=existClass;}publicintgetMark(){Stringvalue=exist。

sayHello();returnvalue;}publicintgetInfo(){Stringvalue=exist。

sayWorld();returnvalue;}}

//客户端调用TargetClasstarget=newClassAdapter(newExistClass());ClientInvoking。

invoke(target);

在该种模式下,设计到两个类,且最后要进行向上转型,根据Java的单继承机制,我们只能通过持有对象的形式,即对象适配器模式。

模式三:缺省适配器模式

该模式中,不存在显式的目标类型,而仅有源类型;之所以需要用到这个,往往是因为源类型中提供了太多我们并不需要的东西,我们需要通过适配器模式进行定制化。

以WindowListener作为例子讲解:

//WindowListener源码publicinterfaceWindowListenerextendsEventListener{publicvoidwindowOpened(WindowEvente);publicvoidwindowClosing(WindowEvente);publicvoidwindowClosed(WindowEvente)。

}

//添加监听器的例子Frameframe=newFrame();frame。

addWindowListener(newWindowListener(){@OverridepublicvoidwindowOpened(WindowEvente){}@OverridepublicvoidwindowClosing(WindowEvente){}@OverridepublicvoidwindowClosed(WindowEvente){}。

})

这样的代码,看起来很繁琐;比如说我只需要监听正在关闭的事件,却生成了许多与此无关的模板代码,降低了代码的可读性,鉴于此,我们来做下定制,只监听一个接口;

我们首先提供一个抽象类实现了该接口,并为所有监听器提供空实现;然后再用抽象类的子类重写窗口正在关闭的监听器的实现,代码如下:

//适配器publicabstractListenerAdapterimplementsWindowListener{publicvoidwindowOpened(WindowEvente){}publicvoidwindowClosing(WindowEvente){}publicvoidwindowClosed(WindowEvente){}。

}

//重写方法publicclassOverrideWindowClosingextendsListenerAdapter{@OverridepublicvoidwindowClosing(WindowEvente){//TODO}}

//客户端调用frame。

addWindowListener(newOverrideWindowClosing());

该方式简化了接口,提高了代码可读性。

最重要的是,我们实现了对接口的定制,可以只做自己关心的事情。

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

更多相关教程请访问Java视频教程,java开发图文教程,bootstrap视频教程!

AD:【5G云技术交流群】入群打赏4。

8,打赏备注QQ号,核对后进群

0个人已赞赞一个收藏(0)打赏

入群打赏请备注QQ,购买打赏请备注邮箱