一、基本介绍

  1. 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要的目的是兼容性,让原本因接口不匹配不能在一起工作的两个类可以协同工作,其别名为包装器
  2. 适配器模式属于结构型模式
  3. 主要分类三类:类适配器模式、对象适配器模式、接口适配器模式

    二、工作原理

  4. 适配器模式:讲一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容

  5. 从用户的角度看不到被适配者,是解耦的
  6. 用户调用适配器器转化出来的目标接口方法,适配器在调用被适配者的相关接口方法
  7. 用户收到反馈结果,感觉这是和目标接口交互:如图:
  8. image.png

    三、类适配器模式举例

    1、被适配的类

    1. public class Voltage220V {
    2. //输出220V的电压
    3. public int output220V() {
    4. int src = 220;
    5. System.out.println("电压=" + src + "伏");
    6. return src;
    7. }
    8. }

    2、适配接口

    1. public interface IVoltage5V {
    2. public int output5V();
    3. }

    3、适配器类

    ```java public class VoltageAdapter extends Voltage220V implements IVoltage5V {

    @Override public int output5V() {

    1. // TODO Auto-generated method stub
    2. //获取到220V电压
    3. int srcV = super.output220V();
    4. int dstV = srcV / 44 ; //转成 5v
    5. return dstV;

    }

}

  1. <a name="CbNtJ"></a>
  2. ### 4、手机类
  3. ```java
  4. public class Phone {
  5. //充电
  6. public void charging(IVoltage5V iVoltage5V) {
  7. if(iVoltage5V.output5V() == 5) {
  8. System.out.println("电压为5V, 可以充电~~");
  9. } else if (iVoltage5V.output5V() > 5) {
  10. System.out.println("电压大于5V, 不能充电~~");
  11. }
  12. }
  13. }

5、客户端

  1. public class Client {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. System.out.println(" === 类适配器模式 ====");
  5. Phone phone = new Phone();
  6. phone.charging(new VoltageAdapter());
  7. }
  8. }

类适配器模式注意事项和细节:

  1. Java是单继承机制,所以类适配器需要继承src类这一点算是一个缺点,因为这要求dst必须是接口,有一定局限性
  2. src类的方法在Adapter中都会暴露出来,也增加了使用的成本
  3. 由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了

    四、对象适配器

    1、基本介绍

    image.png
    其他和类适配器一样,只对适配器类进行改造,如下: ```java public class VoltageAdapter implements IVoltage5V {

    private Voltage220V voltage220V; // 关联关系-聚合

    //通过构造器,传入一个 Voltage220V 实例 public VoltageAdapter(Voltage220V voltage220v) {

    1. this.voltage220V = voltage220v;

    }

    @Override public int output5V() {

    1. int dst = 0;
    2. if(null != voltage220V) {
    3. int src = voltage220V.output220V();//获取220V 电压
    4. System.out.println("使用对象适配器,进行适配~~");
    5. dst = src / 44;
    6. System.out.println("适配完成,输出的电压为=" + dst);
    7. }
    8. return dst;

    } }

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2925391/1631709868656-68b50205-94fc-4bcd-b56a-ce98e42806ca.png#height=115&id=t2ldW&margin=%5Bobject%20Object%5D&name=image.png&originHeight=229&originWidth=879&originalType=binary&ratio=1&size=176803&status=done&style=none&width=439.5)
  2. <a name="hjtbF"></a>
  3. # 五、接口适配器模式
  4. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2925391/1631709896547-9ea2ed67-ed72-44ae-826d-53f0f9e29348.png#height=129&id=fGVwN&margin=%5Bobject%20Object%5D&name=image.png&originHeight=257&originWidth=853&originalType=binary&ratio=1&size=223184&status=done&style=none&width=426.5)
  5. <a name="z7AjA"></a>
  6. ### 举例:
  7. ```java
  8. public interface Interface4 {
  9. public void m1();
  10. public void m2();
  11. public void m3();
  12. public void m4();
  13. }
  1. //在AbsAdapter 我们将 Interface4 的方法进行默认实现
  2. public abstract class AbsAdapter implements Interface4 {
  3. //默认实现
  4. @Override
  5. public void m1() {
  6. }
  7. @Override
  8. public void m2() {
  9. }
  10. @Override
  11. public void m3() {
  12. }
  13. @Override
  14. public void m4() {
  15. }
  16. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. AbsAdapter absAdapter = new AbsAdapter() {
  4. //只需要去覆盖我们 需要使用 接口方法
  5. @Override
  6. public void m1() {
  7. // TODO Auto-generated method stub
  8. System.out.println("使用了m1的方法");
  9. }
  10. };
  11. absAdapter.m1();
  12. }
  13. }

image.png