设计模式第六篇-组合型模式【适配器模式】
一、什么是适配器模式?
定义: 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
通俗理解: 为了让旧接口可以兼容满足新接口使用。
二、角色划分?
1、被适配者 Adaptee: 被转换的接口
2、目标接口: 即需要实现的功能接口
3、适配器: Adpter 将被转换的接口(原始接口)转换为目标接口使用,即让原接口与目标接口兼容
三、适配器模式分类?
1、类适配器,静态关系
特点:1、 适配器实现目标接口
2、 适配器继承被适配者
即: Adapter extends Adaptee implement Target
优点: 适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法
缺点: 因为适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理Adaptee的子类了
2、对象适配器,动态关系
特点: 1、适配器实现目标接口
2、适配器持有被适配者的引用
即: Adapter implements Target{
Adaptee adaptee;
}
优点: 对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
缺点: 对于对象适配器,要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。
3、建议尽量使用对象适配器的实现方式,多用合成/聚合,当然具体问题还是得具体分析
四、案例?分析
案例一: 个需求,第一个版本只是实现了美元的功能,现在需求需要支持人民币,同时需要兼容这两种模式,因此可以考虑使用适配器模式,将第一期的美元适配为人民币。
案例二: Android listview的适配器模式
分析? ListView为什么要使用Adapter模式呢? 如何将数据显示在ui上?
1、ListView需要能够显示各式各样的视图,每个人需要的显示效果各不相同,显示的数据类型、数量等也千变万化。那么如何隔离这种变化尤为重要。因此使用适配器隔离该层。将ListView需要的接口抽象到Adapter(BaseAdapter)对象中,这样只要用户实现了Adapter的接口,ListView就可以按照用户设定的显示效果、数量、数据来显示特定的Item View。 通过代理数据集来告知ListView数据的个数( getCount函数 )以及每个数据的类型( getItem函数 ),最重要的是要解决Item View的输出。Item View千变万化,但终究它都是View类型,Adapter统一将Item View输出为View ( getView函数 ),这样就很好的应对了Item View的可变性。
2、当然这里的Adapter并不是经典的适配器模式,但是却是对象适配器模式的优秀示例,也很好的体现了面向对象的一些基本原则。这里的Target角色和Adapter角色融合在一起,Adapter中的方法就是目标方法;而Adaptee角色就是ListView的数据集与Item View,Adapter代理数据集,从而获取到数据集的个数、元素。注意到了吗,对象适配器重要特点是持有被适配者的引用,listview适配器模块被适配者就是数据,因此Adapter都需要传入数据,理解了吧。。。