这几天一直在学习设计模式,今天我们来说说适配器设计模式吧
适配器模式
在接口类型设计模式中定义的有一个适配器模式,关于适配器模式的学习中主要围绕以下几个问题展开:
1. 什么是适配器模式?
2. 适配器模式的特点?
3. 适配器模式如何定义?
4. 在何时使用适配器模式?
适配器模式就是将一个类的接口转化为另一个类所需要的接口,此种模式就相当于一个转化器,将不适用的一个接口转化为适用的接口。只是文字的描述并不能直观的理解什么是适配器模式,举个例子吧。大家都是用电脑,我们日常使用的电压都是220V的,但是这并不是电脑需要的正常电压,所以需要一个适配器来将220V转化为电脑需要的正常电压,所以电脑的电源就是一个适配器。现在很流行的一个U盘和手机的结合,手机上明显没有U盘所需要的USB 接口,我们无法改U盘的设计更无法更改手机的设计,所以只能通过其他办法将两者联系起来,通过一个转化线将U盘连接到手机上,而这条线就是一个适配器模式的很好体现。。。。
适配器的特点:
适配器模式可以将一个类的接口和另一个类的接口匹配起来,使用的前提是不能或者不想修改原有的母接口。
适配器的定义方面有两种方式,一种是类适配器,另一种是对象适配器
EX:
类适配器的定义形式:
public interface xmlReader{
public InputStream xmlReader(); //我们项目所需要的格式
}
public class ReaderXML{
public InputStream ReaderXML(); //这是已经存在的功能
}
//下面就是我们需要定义的适配器了
public class Adapter extends ReaderXML implements xmlReader{
public InputStream xmlReader(){
return ReaderXML();
}
}
对象适配器的定义形式:
public class Adapter implements xmlReader{
ReaderXML readerxml = new ReaderXML();
public InputStream xmlReader(){
return readerxml.ReaderXML();
}
}
虽然提供了两种不同的定义方式,那么该如何使用哪一种呢?并且两者之间有什么区别?
类适配器通过继承类适配者实现的,并且实现所需要的接口,对象适配器是包含一个适配者的引用,两者之间的比较,更倾向使用类适配器模式,两者在内部实现上都使用的是被适配者来处理的,使用上没有什么大的区别,但是两者在内存等资源的使用上,类适配器模式明显要优于对象适配器模式。在使用时,创建一个适配器Adapter对象,使用类适配器模式的时候只需要创建一个这个对象就可以了,但是在使用对象适配器模式的时候,在创建适配器Adapter的时候,适配器对象内部又创建了一个被适配者对象,造成了内存的消耗,综合对比更倾向于使用类适配器模式定义适配器
何时使用适配器才合适呢?
当我们在开发中已经存在一个类或者一个功能,但是现在有一个新的功能实现中有与此已存在的功能相似的地方,我们正在实现的功能在接口的定义以及实现上与此已存在的功能有所不同,(我们需要的功能在一些第三方的库中已经实现了,但是我们没有源代码并不能修改此第三方库代码)这时候我们可以通过使用适配器模式实现。定义一个适配器类,将第三方的功能转化为我们需要的实现形式。
在项目开发过程中我们到底什么时候使用适配器模式呢?
通常使用适配器模式是在项目开发的后期或者软件维护部分或者使用无源代码的第三方库的时候,在项目开发过程中我们尽量使用代码重构的方式来实现,当项目开发后期或者维护期,大多数功能都已经实现完成,而只有少部分功能或者更少的功能需要用到前面已经实现好的代码,这时候我们不能通过修改前面已经实现好的代码来迎合现在功能的需求,不然我们前面实现的功能将有可能出现无法预料的错误或者导致整合项目的失败,这时候我们可以通过适配器模式的使用,来使前面已经实现的代码能够同时适用现阶段功能的需求,用最简洁的方式以及最小的代价完成项目的需求。另外当我们项目中需要实现的功能已经在第三方的库中得以实现,但是我们没有第三方库的代码并不能通过代码重构的方式来实现我们的要求,这是我们就可以通过适配器模式来把第三方库中已经实现的功能集成到我们项目中去,达到我们项目的需求。
总结一下:
1. 在项目前期尽量用重构的方式实现,在项目维护期使用适配器模式
2.在使用第三方库达到我们的需求的时候(使用的库无源代码)。