亲身实践,JAVA最优良的Adapter模式适配器模式

摘要:
互联网上有很多JAVA适配器模型的例子,但例子真的很少,这真的不太好。我总结了一个在性能和结构方面易于理解的适配器模式。适配器模式,也称为适配器模式,是GoF提出的23种设计模式之一。适配器模式是构造模式之一。通过适配器模式,可以更改现有类的接口形式。适配器模式是针对此类类似要求而提出的。实现适配器模式的两个方法和示例适配器模式通过调用适配器类中的外部组件来实现函数。

网上关于JAVA的适配器模式例子有很多,但真的有少实在不怎么样,看也不懂。自己总结了一个在性能和结构上都很容易理解的Adapter模式。



Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式。

在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:
我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;所以很多情况下会选择先暂时使用外部组件,以后再考虑随时替换。但这样一来,会带来一个问题,随着对外部组件库的替换,可能需要对引用该外部组件的源代码进行大面积的修改,因此也极可能引入新的问题等等。如何最大限度的降低修改面呢?
Adapter模式就是针对这种类似需求而提出来的。

Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。


实现Adapter模式的2种方法与范例
Adapter模式通过在Adapter类中调用外部组件来实现功能。
根据调用方式的不同,Adapter模式有2种实现方法:
1,通过继承实现Adapter

亲身实践,JAVA最优良的Adapter模式适配器模式第1张
2,通过委让实现Adapter
亲身实践,JAVA最优良的Adapter模式适配器模式第2张

为了能更清楚地说明2种实现方法的区别,我们举例说明:
比如,我们需要实现一个发送邮件的功能,需要用到一个名为OutMailer的外部组件,因为上述原因,我们决定用Adapter模式实现对OutMailer的透明调用。
首先,我们把邮件发送的功能抽象成一个接口:

亲身实践,JAVA最优良的Adapter模式适配器模式第3张IMailer.java
interface IMailer {
    
//发送邮件
    publicvoid sendMail();
}


然后定一个实现IMailer接口的MailerAdapter类。

下面我们来看看MailerAdapter的实现方法。

通过继承实现Adapter
亲身实践,JAVA最优良的Adapter模式适配器模式第3张MailerAdapter.java
class MailerAdapterextends OutMailerimplements IMailer {
    
//发送邮件
    publicvoid sendMail() {
        
//调用OutMailer.sendMail()方法实现邮件发送
        this.sendMail();
    }

    
//这里省略其他方法
}


通过委让实现Adapter
亲身实践,JAVA最优良的Adapter模式适配器模式第3张MailerAdapter.java
class MailerAdapterimplements IMailer {
    
private OutMailer outMailer =new OutMailer();
    
//发送邮件
    publicvoid sendMail() {
        
//调用OutMailer.sendMail()方法实现邮件发送
        outMailer.sendMail();
    }

    
//这里省略其他方法
}



不管是通过继承实现Adapter,还是通过委让实现Adapter,调用方MailerClient的调用方法完全一样,如下:
亲身实践,JAVA最优良的Adapter模式适配器模式第3张MailerClient.java
IMailer mailer =new MailerAdapter();
...
mailer.sendMail();

我们可以看到,这里完全没有直接调用OutMailer,也就是说OutMailer即使被替换了,我们也不用对MailerClient做任何修改。

免责声明:文章转载自《亲身实践,JAVA最优良的Adapter模式适配器模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用蒲公英路由器 X3 设置为网络中继器使用nightwatch进行E2E测试中文教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于canal的client-adapter数据同步必读指南

本文将介绍canal项目中client-adapter的使用,以及落地生产中需要考虑的可靠性、高可用与监控报警。(基于canal 1.1.4版本)   canal作为mysql的实时数据订阅组件,实现了对mysql binlog数据的抓取。 虽然阿里也开源了一个纯粹从mysql同步数据到mysql的项目otter(github.com/alibaba/ot...

C#设计模式总结(转)

一、引言   经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构。所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式。这里对设计模式做一个总结,一来可以对所有设计模式进行一个梳理,二来可以做一个索引来帮助大家收藏。   PS: 其实,很早之前我就看过所有的设计模式了,但是...

WebRTC学习(三)WebRTC设备管理

一:WebRTC设备管理 (一)重要API,用于获取音视频设备 其中返回的ePromise结果,是一个Promise对象。 Promise对象的结构体:MediaDevicesInfo  deviceID:是设备唯一标识符ID label:是设备的名字(可读的) kind:设备的种类(音频输入/输出两种,视频输入/输出两类) groupID:同一个设备...

Java设计模式透析之 —— 适配器(Adapter)

转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400141 今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧急任务!最近ChinaJoy马上就要开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数。” 你看了看日期,不是吧!这哪里是马上要开始了...

android spinner学习

   用法 1 :以资源方式,静态展示 Spinner 选项 1.     在资源文件 (strings.xml) 中,增加:          < string name = "spin_prompt" > 请选择城市 </ string >          < string-array name = "cities" &...

适配器模式之对象适配器

  问题导入:比如有A型螺母和B型螺母,那么用户可以再A型螺母上直接使用按着A型螺母生产的A型螺丝,同样也可以在B型螺母上直接使用按着B型螺母标准生产的B型螺丝。但是由于A型螺母和B型螺母的标准不一样,用户在A型螺母上不能直接使用B型的螺丝,反之也一样。该如何达到这个目的呢?   使用适配器就可以解决这个问题:生产一种“A型螺母适配器”,这种A型螺母适配器...