设计模式-适配器模式-结构型

本小妞迷上赌 提交于 2019-11-30 15:11:20

定义:

把一个类的接口转换成客户所期待的另一种接口,从而使不兼容的那些类可以一起工作

类型:

结构型

理解:

  • 提供一个中间层,将一个对象的接口转换成所需要的接口,而不改变原有的类;
  • 比如生活中的电源适配器可以将生活用电的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不能支持多继承,所以一次只能适配一个被适配的类,不能同时适配它的子类
  • 对象适配器的缺点:不能重写待适配类的方法
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!