适配器模式

一 定义

适配器模式在我们的开发过程中使用率非常高,从android开发中随处可见的Adapter就可以看出。那么什么是适配器模式呢,适配器是将两个不兼容的类融合在一起,将不同的东西通过一种转换使得他们协作起来。

适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法再一起工作的两个类能够在一起工作。

简单地说,适配器就是一种适配中间件,它存在于不匹配的了两者之间,用于连接两者,使不匹配变得匹配。

二 使用场景

  • 系统需要使用现有的类,而此类的接口不符合系统的需要,既接口不兼容。
  • 想要建立一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类,包括一些可能在将来引进。
  • 需要一个统一的输出接口,而输入端的类型不可预知。

三 类适配器

适配器模式分为两种,既类适配器模式和对象适配器模式。首先看类是适配器模式。

三-1 模式结构

《适配器模式》

如图所示,类适配器是通过实现Target接口以及继承Adaptee类实现接口转换的,例如,目标接口Target需要的是operation2,但是Adaptee里只有一个operation3,因此就出现了不兼容的情况,因此可以通过Adapter实现一个operation2方法将Adaptee的operation3转化为Target需要的operation2,实现兼容。

  • Target:目标角色,该角色定义把其他类型转化为何种接口,也就是我们期望的接口。
  • Adaptee:需要适配的接口,源角色。
  • Adapter:适配器角色,将源角色转换为目标角色,也是本模式的核心。这一角色不可以是接口,而必须是实体类。

三-2 实例

下面以生活中常见的给手机充电的例子来说明,生活中的电线电压一般都是220v,而手机充电需要的电压是5v的,这就出现了不匹配的情况,这时就需要一个中间层,即适配器来解决。
通过以上分析可知,5v的电压就是Target接口,220V电压就是Adaptee类,而将电压从220V转换为5V就是Adapter。

具体的代码如下:

  • Target角色,目标角色,是一个接口或者抽象类
// Target角色
public interface FiveVolt {
    public int getVole5();
}
  • Adaptee角色
// Adaptee角色,需要被转换的对象
public class Volt220 {
    public int getVolt220(){
        return 220;
    }
}
  • Adapter 角色
// Adapter角色,将220V的电压
public class VoltAdapter extends Volt220 implements FiveVolt{
    @Override
    public int getVole5() {
        return 5;
    }
}
  • 测试代码
 VoltAdapter adapter=new VoltAdapter();
        System.out.println("输出电压: "+adapter.getVole5());

以上,因为对应的Target的目标是要获取5v的输出电压,而Adatee正常输出电压是220V,此时就需要Adapter将220v的电压转换为5v电压,解决了接口不兼容问题。

四 对象适配器

与类适配器不同的是,对象适配器在将适配的类的API转换为目标类的API时,不是使用继承的关系,而是使用代理的方式。
也就是说,需要提供一个包装类Adapter,这个包装类包装了一个Adaptee的实例,从而此包装类能够把Adaptee的API与Target类的API链接起来。

代码如下

  • Target角色,目标角色
// Target角色
public interface FiveVolt {
    public int getVole5();
}
  • Adaptee角色
// Adaptee角色,需要被转换的对象
public class Volt220 {
    public int getVolt220(){
        return 220;
    }
}
  • Adapter 角色
// 对象适配器模式
public class VoltsAdapter implements FiveVolt{

    Volt220 mVolt220;

    public VoltsAdapter(Volt220 adaptee){
        mVolt220=adaptee;
    }


    public int getVolt220(){
        return mVolt220.getVolt220();
    }


    @Override
    public int getVole5() {
        return 5;
    }
}
  • 测试代码
    VoltsAdapter adapter1=new VoltsAdapter(new Volt220());
        System.out.println("输出电压: "+adapter1.getVole5());

适配器模式的本质就是:转换匹配,复用功能。适配器模式具有以下优点:

  • 更好的复用性
    如果功能已经有了,只是接口不兼容,那么可以通过是适配器模式让这些功能得到很好的复用。
  • 更好的扩展性
    使用适配器模式可以自然地扩展系统的功能。
  • 但是,不宜过多地使用适配器,会让系统非常凌乱,不易于对对项目的整体把握。
    原文作者:Jackson杰
    原文地址: https://www.jianshu.com/p/7e4f8458d81c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞