提到Adapter适配器相信很多人都特别熟悉了,在我们开发中经常出现一些实现继承适配器去完成某项功能,使用最多的可能就是ListView和RecyclerView的是适配器了,不知道有没有同学想过适配器的作用呢?为什么要使用这些适配器?以及他们所带来的好处呢?
下面我们举个例子:如果你去了某个地方,准备要给你的手机充电,发现整个房间的都是三孔插座,而你的手机充电器只能使用两空,这时你会去前台寻求帮助,前台可能会给你一个带有两空的插板,这时你回去把插板插在房间的三孔插座你的手机就可以充电了,我们来分析下这个过程,:
上述过程使用了插线板将三孔插座抓还为两孔充电,插线板起到了将三孔插座电源适配给两孔充电器的功能,也就是Adapter的功能。在程序中将这种用于填补“现有程序”和“所需程序”之间差异的设计模式叫Adapter(适配器)模式。
Adapter模式分为两种:
下面我们分别来介绍若何实现这两个适配器:
假设现在需要12伏的电压,可是只提供100V的电压输出,需要采用适配器来转换为12V,我们按照上面的例子分析这个问题:
现在我们将上述需求和条件转换为想用的代码实现:
需求接口获得12V的电压:
interface ElegantTwenty {
fun getElegantT(): Int
}
创建ElegantHundreds类,提供100V电压:
open class ElegantHundreds {
private val elegant: Int = 10
fun getEle(): Int {
return elegant * 10
}
}
为了能将提供的100V电压转化为所需的12V,我们提供一个电压适配器ElegantAdapter用于电压转换,为了能获取提供的电压,我们让ElegantAdapter继承ElegantHundreds,并实现需求的接口,提供需求方法,这里做一个简单的处理将电压降低88V:
class ElegantAdapter : ElegantHundreds(),ElegantTwenty {
override fun getElegantT(): Int {
var ele = getEle()
return ele - 88
}
}
现在我们去获取电压,看看能不能获取到所需的12V电压:
var elegantTwenty: ElegantTwenty = ElegantAdapter()
var elegant = elegantTwenty.getElegantT()
tvElegant.text = "ElegantAdapter 获取的电压为 ${elegant}V"
输出的电压为:
此时已经使用适配器将电压转换为12V了,相信适配器的作用大家都了解了,就是创建一个具体类继承原有功能并实现需求接口,从而达到两者转换的目的,但可能会有同学说如果需求不是接口呢?那根据Java的单继承关系就不能实现上面的关系了,那该怎么办呢?这种情况就是上面所说的第二种委托式的适配器。
现在我们将上面的需求接口ElegantTwenty改成类:
abstract class ElegantTwenty {
abstract fun getElegant12():Int
}
在适配继承需求类ElegantTwenty后,就无法继承ElegantHundreds,所以可以在适配器中创建ElegantHundreds的对象,将所有的相关操作委托给创建的对象操作:
class Adapter : ElegantTwenty(){
//创建一个ElegantHundreds的对象作为委托对象
private val elegant by lazy {
ElegantHundreds()
}
override fun getElegant12(): Int {
return elegant.getEle() - 88
}
}
现在去获取12V电压的方法中会先委托对象拿去提供的100V电压,然后转化为12V,现在我们去获取电压:
var elegant12 : ElegantTwenty = Adapter()
var v = elegant12.getElegant12()
textView.text = "ElegantAdapter 获取的电压为 ${v}V"
到这两种适配器的使用方式都介绍完了,这里只是用简单的实例演示具体的使用方法,下面我们来看看Adapter的登场角色
在类适配其中,Adapter通过继承Adaptee,而在对象适配其中Adapter中持有Adaptee对象,通过对象委托实现。
既然学会了Adapter的使用,那我们在什么情况下选择使用Adapter模式呢?
今天适配模式的介绍就到这里了,周末结束了,又是新的一周继续努力!