适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

场景示例

对于美标和国标的电源插座是存在着差异的,图示(左为美标右为国标),

美式插座

国标插座

现我从美国海淘了一款DELL电脑,电源,插头如下所示:

插头,它是和美标插座匹配的。而对于日常生活中,我们随处可见的是国标插座,没有美标插座可以用。针对这种情况,我们可以在购买如下一款转换器,实现我们使用海淘电脑的需求。

国标美标转换器

这个转换器,它就是电源插头适配器,它将美标的插头,适配成一个国标插头。

实现思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class 美标插座{
useUSA();
}

class 国标插座 {
useChina();
}

class 国标插座适配器 implments 美标插座 {

国标插座 国标;

useUSA() {

国标.useChina();

}

}

//通过这种方式,我们就实现了一个插座转换器,海淘的电脑只需使用这个转换器,就可以实现其在国内的正常使用。

适配器模式常见实现方式:

  • 方式一:对象调用方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    /**
    * B方法去适配A,我们就可以写个B的适配器,它实现了A的方法,这样就可以通过接口实现的方式,
    * 接口适配的方式利用已存在的某个类的方法,实现代码的复用
    */
    interface A {

    haveA();

    }

    class B {
    haveB();
    }

    class BAdapter implements A {

    B obj;

    public AAdapter(B obj) {
    this.obj = obj;
    }

    haveA(){
    obj.haveB();
    }

    }
  • 方式二:使用抽象类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    interface A {

    methodA();
    methodB();
    methodC();

    }

    //我们某个流程只需要接口其中的methodB的实现
    //可以做出如下适配:

    abstract class Aadpater implements A {

    //空实现A
    methodA() {}

    //抽象方法,子类只需要实现此方法
    abstract methodB();

    //空实现C
    methodC() {}

    }
  • 方式三:类适配器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    class A {

    methodA(){};

    }

    interface B {

    methodB();

    }

    Aadpater extends A implements B {

    methodB() {
    //do something

    methodA();
    }

    }

 评论