概念
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。引用自wiki
介绍使用
适配器模式总共由三个角色组成,分别是目标对象Target,被适配对象Adaptee和适配器Adapter。总共有两种类型,分别是类适配器模式,对象适配器模式。
- 类适配器模式:适配器继承目标对象,实现被适配对象的接口,java没有多继承,所以采用实现接口的方式。查看实例代码如下:
// 目标类 typec充电口
abstract class TypecCharger {
public abstract void typecCharge();
}
// 被适配器充电口
interface CommonCharger {
void commonCharge();
}
// 充电转接口
class ChargerAdapter extends TypecCharger implements CommonCharger {
@Override
public void typecCharge() {
commonCharge();
}
@Override
public void commonCharge() {
System.out.println("充电");
}
}
// 调用代码如下
public void charge() {
TypecCharger typecCharger = new ChargerAdapter();
typecCharger.typecCharge();
}
typec充电口和普通充电口不兼容,最终想实现的目的是可以使有typec充电口的手机使用普通充电器经过转接头顺利充电。所以typec充电口就是目标类,普通充电器就是被适配对象,转接头就是适配器。在这里是使用了类适配器模式去实现的,不过有点牵强。这个例子使用对象适配器更合适一些。
- 对象适配器模式:适配器继承自目标类,并且包含一个被适配的对象的实例。代码如下:
// 充电转接口
class ChargerAdapter extends TypecCharger {
CommonCharger commonCharger;
public ChargerAdapter(CommonCharger commonCharger) {
this.commonCharger = commonCharger;
}
@Override
public void typecCharge() {
commonCharger.commonCharge();
}
}
// 调用代码如下
public void charge() {
TypecCharger typecCharger = new ChargerAdapter(new AndroidCommonCharger());
typecCharger.typecCharge();
}
这样一来就好理解一点了,适配器里面包装了被适配对象,真正的执行逻辑有被适配对象实现,适配器只是做个类似中转的角色,委托给被适配对象。
想法
在平时安卓开发过程中,用的最多的就是recycleview和adapter做列表的渲染,最早接触适配器模式,我也是想到这个例子,但是去看了相关的文章,总觉得不是很对的上。所以自己就从概念上的角色去分析, 个人觉得recycleview中的角色分工如下:数据源是被适配对象Adaptee, 渲染得到的view是目标对象Target,adapter就是适配器角色。 数据源在adapter内部通过onBindViewHolder, onCreateViewHolder把数据转化为目标对象——列表的view,从而得到的view就可以交由recycleview去渲染了。也就是从不相关不兼容的数据通过adapter转为兼容的view给recycleview。当然,这个是个人觉得比较合理的理解,欢迎大家交流讨论。