设计模式~适配器模式

185 阅读2分钟

1. 定义

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

2. 使用场景

  • 系统需要使用现有的类,而该类的接口不符合系统的需要,即接口不兼容
  • 想建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类
  • 需要一个统一的输出接口,而输入端的类型不可预知

3.适配器模式分类

  • 适配器可分为类适配器模式和对象适配器模式,相对而言,对象适配器模式会更加灵活实用

4. UML类图

image.png

  • Target:目标角色
  • Adaptee:需要适配的接口
  • Adapter:适配器角色,该模式的核心所在,是一个具体类,承担了将源接口转换为目标接口的角色

5. 简单实现

  • 需求:国内的电压是220v,而美国的电器是110v,美国人来中国就需要一个将220v转换为110v的适配器

目标接口

/**
 * Target角色(获得110v电压)
 *
 * @author BTPJ  2022/9/26
 */
public interface Volt110 {
    int getVolt110();
}

原始类

/**
 * Adaptee角色,需要被转换的对象(220v电压)
 *
 * @author BTPJ  2022/9/26
 */
public class Volt220 {

    public int getVolt220() {
        return 220;
    }
}

5.1 使用类适配器的实现方式

适配器

/**
 * Adapter类适配器角色(将220v转换为110v)
 *
 * @author BTPJ  2022/9/26
 */
public class VoltAdapter extends Volt220 implements Volt110 {
    @Override
    public int getVolt110() {
        return 110;
    }
}

测试类

/**
 * 类适配器测试类
 *
 * @author BTPJ  2022/9/26
 */
public class TestClient {
    public static void main(String[] args) {
        VoltAdapter adapter = new VoltAdapter();
        System.out.println("类适配器方式输出电压为:" + adapter.getVolt110());
    }
}

运行结果:
类适配器方式输出电压为:110

5.2 使用对象适配器的实现方式

适配器

/**
 * Adapter对象适配器角色(将220v转换为110v)
 *
 * @author BTPJ  2022/9/26
 */
public class VoltAdapter implements Volt110 {

    private Volt220 mVolt220;

    public VoltAdapter(Volt220 volt220) {
        this.mVolt220 = volt220;
    }

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

    @Override
    public int getVolt110() {
        return 110;
    }
}

测试类

/**
 * 对象适配器测试类
 *
 * @author BTPJ  2022/9/26
 */
public class TestClient {
    public static void main(String[] args) {
        VoltAdapter adapter = new VoltAdapter(new Volt220());
        System.out.println("对象适配器方式输出电压为:" + adapter.getVolt110());
    }
}
运行结果:
对象适配器方式输出电压为:110
  • 由此可见:类适配器模式常用的方式是继承,而对象适配器模式则是聚合

6. 源码中的使用场景

  • ListView、RecyclerView中使用适配器模式绑定列表数据

7. 优缺点

  • 优点:
    • 更好的复用性;
    • 更好的扩展性;
  • 缺点:
    • 过多地使用适配器会导致系统变得零乱,不易整体把握