一文带你理解适配器模式

适配器模式是一种极为常见的设计模式,特别是在Android世界中,像ListViewAdapter就是典型的适配器模式应用场景。适配器模式解决的是两个不相容的接口或者对象之间的兼容性问题,他提供一种混合适配器和目标对象之间的接口或者方法的混血对象。

定义

把一个类的接口变换成客户端所期待的另一种接口,从而使原先因为接口不匹配而无法一起工作的两个类可以一起工作。

场景

  1. 系统需要使用一个类,但是该类接口无法在系统中被直接使用
  2. 想建立一个通用的可以在多个类之间协调问题的类
  3. 在输入不固定的时候,想统一输出

角色

目标对象Target

需要的接口或者方法

适配对象

需要适配的对象,提供的接口无法被目标对象直接使用

适配器

转换对象,用来将适配对象的方法或者接口转换成目标对象能够识别的格式

分类

类适配器

该类型适配器服务的目标对象必须是接口类型,通过实现目标对象接口并继承适配对象来实现适配器的功能。
例如,考虑一种多款充电器的场景,现在有目标接口ICharge需要一个6V的充电器,苹果充电器AppleCharge提供了5V的输出,此时,需要考虑使用一个电压转换器,来提供多种电压的输出。


/**
 * 目标接口
 */
public interface ICharge {

  /**
   * 获取6V充电电压
   */
  double get6Voltage();
}

/**
 * 适配器类
 */
public class AppleCharge {

  /**
   * 苹果充电器输出5V电压
   */
  public double get5Voltage() {
    return 5;
  }
}

这是一种典型的类适配器模式。我们可以通过实现继承的方式来完成适配器的创建

public class ChargeAdapter extends AppleCharge implements ICharge {

  @Override public double get6Voltage() {
    return 6.0D;
  }

  @Override public double get5Voltage() {
    return 5.0D;
  }
}

这样,苹果充电器就可以满足目标充电器的需求,来输出6V的电压了。

对象适配器

对象适配器是区别于类适配的一种方式,它不是通过实现继承的方式来完成适配工作,而是通过代理的方式来完成的。在适配器内部会持有一个适配对象的引用,通过创建与适配对象一模一样的API来完成适配工作。还是以上文中的充电器场景举例来看看如何实现对象适配器

public class ObjectAdapter implements ICharge {

  private AppleCharge appleCharge;

  public ObjectAdapter(AppleCharge appleCharge) {
    this.appleCharge = appleCharge;
  }

  public double get5Voltage() {
    return appleCharge.get5Voltage();
  }

  @Override public double get6Voltage() {
    return 6.0D;
  }
}

可以看到,适配器会持有一个适配类的对象,构成一种静态代理模型,从而完成适配工作。

关于安卓源码

开篇说过,在安卓世界中,适配器模式使用异常广泛,其中最典型的就是列表控件中的适配器。在这种环境下,适配器提供的功能已经不局限于粘合剂的角色。它更是提供了一种将数据和UI进行适配的功能,将控件UI的渲染和数据集进行分离,然后利用适配器来进行视图数据的绑定,让控件可以拥抱更多的变化,提高了控件的灵活性和扩展性。下文是Adapter接口的文件说明,表明了Adapter的适配器角色特性。

/**
 * An Adapter object acts as a bridge between an {@link AdapterView} and the
 * underlying data for that view. The Adapter provides access to the data items.
 * The Adapter is also responsible for making a {@link android.view.View} for
 * each item in the data set.
 */
public interface Adapter {
}

总结

适配器模式是一种非常常见以及实用的设计模式。他为类提供了更好的复用性,在极小的修改下就可以将优秀的类引入到当前系统中,哪怕两者接口无法兼容;与此同时,适配器内部可以随时调用自己的功能,提高了整个系统的可扩展性。当然,过多的适配器会降低代码的可读性,提高维护难度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值