5 结构型模式之 - 适配器模式
九路 204 6

适配器模式的介绍

适配器模式在开发中使用率很高,适配器是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得它们能够协作起来。例如经常碰到两个不相关的类之间进行交互,第一个解决方案是修改各自类的接口,但是如果没有源码或者我们不愿意为了一个应用而修改各自的接口,此时怎么办?这种情况我们往往会使用一个Adapter,在这两种接口之间创建一个“混血儿”接口,这个Adapter会将这两个接口兼容,在不修改源码的情况下满足需求。

适配器模式的定义

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

适配器使用场景:

1 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容

2 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作

3 需要一个统一的输出接口,而输入端的类型不可预知

用电源接口做例子,笔记本电脑的电源一般都是5V电压,但是我们生活中的电线电压一般都是220V,这个时候就出现了不匹配的情况,不软件开发中我们称之为接口不兼容,此时就需要适配器来进行一个接口转换,在软件开发中有一句话正好体现了这点:任何问题都可以加一个中间层来解决。这个层我们可以理解为这里的Adapter层,通过这层来进行一个接口转换就达到了兼容的目的。

适配器模式分分两种:

1)类适配器模式

2) 对象适配器模式

先说第一种类适配器模式:

5V电压的接口,代码如下:

 /**
  * Target角色,就是要转换成的5V的
  */
 public interface FiveVolt {
     int getVolt5();
 }

220V的电压,需要被转换的

/**
 * 220V的电压,被转换的类
 */
public class Volt220 {
    public int getVolt220(){
        return 220;
    }
}

下面是Adapter角色,将220V的电压转换成5V的电压

/**
 * 适配器,即有5V的,又有220V的,就像转换头一样,两边都可以兼容
 */
public class ClassVoltAdapter extends Volt220 implements FiveVolt {
    @Override
    public int getVolt5() {
        return 5;
    }
}

看到没,上面的ClassVoltAdapter里面即有220V的,又有5V的,需要5V的也可以用,需要220V的也可以用。

下面是类适配器模式的测试类:

/**
 * 下面是类适配器模式的测试类
 */
public class ClassAdapterTest {
    public static void main(String[] args){
        test();
    }

    public static void test(){

        ClassVoltAdapter voltAdapter = new ClassVoltAdapter();
        System.out.println(voltAdapter.getVolt5());

    }

}

下面再来看看第二种适配器模式:对象适配器模式

首先前面的 5V的接口和220V的类还是一样的。这里只是把代码贴出来供方便查看的。

5V电压的接口,代码如下:

/**
  * Target角色,就是要转换成的5V的
  */
 public interface FiveVolt {
     int getVolt5();
 }

220V的电压类

/**
 * 220V的电压,被转换的类
 */
public class Volt220 {
    public int getVolt220(){
        return 220;
    }
}

下面看一下对象适配器类:主要是实现了目标接口,并且保存了一个被转换的类的对象的引用 ,代码如下:

/**
 * 对象适配器,实现目标接口,保存一个被转换对象的引用
 */
public class ObjectVoltAdapter implements FiveVolt{
    //保存一个被转换对象的引用
    Volt220 volt220;

    public ObjectVoltAdapter(Volt220 volt220){
        this.volt220 = volt220;
    }

    @Override
    public int getVolt5() {
        return 5;
    }

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

下面是对象适配器模式测试类:

/**
 * 对象适配器的测试类
 */
public class ObjectVoltAdapterTest {
    public static void main(String[] args){
        test();
    }

    public static void test(){
        //创建一个220V的电压类的对象,也就是被转换的类的对象
        Volt220 volt220 = new Volt220();
        //创建一个对象适配器类的对象,并且保存一个被转换的类的对象
        ObjectVoltAdapter voltAdapter = new ObjectVoltAdapter(volt220);
        System.out.println(voltAdapter.getVolt5());
    }
}
预览图
评论区

索引目录