定义:
把一个类的接口转换成客户所期待的另一种接口,从而使不兼容的那些类可以一起工作
类型:
结构型
理解:
- 提供一个中间层,将一个对象的接口转换成所需要的接口,而不改变原有的类;
- 比如生活中的电源适配器可以将生活用电的220v电压转换成电器所需要的电压,Android中常见的Adapter可以将不同类型的数据、不同的布局视图绑定到ListView
- 适配器模式分为两种:类适配器模式和对象适配器模式;他们实现的方式不一样,前者通过继承关系实现,而后者则是通过关联关系实现
/**
* 家庭用电电压
*/
open class HomeVoltage {
fun getHomeVoltage():Int{
return 220
}
}
/**
* 手机电源需要的5v电压
*/
interface MobilePhoneVoltage {
fun getMobilePhoneVoltage():Int
}
/**
* 电压适配器-类适配器
*/
class VoltageClassAdapter :HomeVoltage(),MobilePhoneVoltage{
override fun getMobilePhoneVoltage(): Int {
return getHomeVoltage()/44
}
}
/**
* 电压适配器-对象适配器
*/
class VoltageObjectAdapter(private val homeVoltage: HomeVoltage) :MobilePhoneVoltage{
override fun getMobilePhoneVoltage(): Int {
return homeVoltage.getHomeVoltage()/44
}
}
运行结果:
类转换器 :5
对象转换器 :5
Process finished with exit code 0
类结构图如下:
- 类适配器:继承要转换的类,然后实现需要的接口
- 对象适配器:实现需要的接口,关联要转换的类
Android中的适配器模式:
最常见的就是ListView、GridView所对应的Adapter,它采用的是对象适配器模式,通常我们都需要自己定义一个Adapter类,例如:
class MyAdapter(private val context:Context) : BaseAdapter() {
val mData = ArrayList<String>()
override fun getView(postion: Int, convertView: View?, parentView: ViewGroup?): View {
return ImageView(context)
}
override fun getItem(postion: Int): Any {
return mData[postion]
}
override fun getItemId(postion: Int): Long {
return postion
}
override fun getCount(): Int {
return mData.size
}
}
需要适配的对象就是数据集合以及视图,目标需要的接口就是待实现的那些方法:getView、getItem、getItemId、getCount
优点:
- 能够复用已经存在的类,在不改变原有类的情况下转换成需要的接口
- 能够在原有功能基础上扩展功能
- 类适配器模式能够重写待适配类的方法
- 对象适配器模式可以把待适配对象和它的子类都转成目标接口
缺点:
- 过多的使用适配者模式容易使得系统凌乱,明明看到调用的是A接口,内部却是用B接口实现
- 类适配器的缺点:由于java不能支持多继承,所以一次只能适配一个被适配的类,不能同时适配它的子类
- 对象适配器的缺点:不能重写待适配类的方法
来源:CSDN
作者:guangdeshishe
链接:https://blog.csdn.net/guangdeshishe/article/details/100101067