Skip to content

适配器模式

一、介绍

适配器模式是作为两个不兼容的接口之间的桥梁,属于结构型模式,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

在使用一些旧系统或者是类库时,经常会出现接口不兼容的问题,适配器模式在解决这类问题具有优势,学习设计模式一定不要局限代码层面,要从软件系统整体去考虑,而不是为了使用设计模式,而去使用设计模式

几种常见的适配器

  • 类的适配器模式:想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可

  • 对象的适配器模式:想将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行

  • 接口的适配器模式:不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即

二、接口适配器

有些接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要实现部分接口就可以了

三、应用场景

需求:收购的项目客户端C,需要做公司原来的项目用户数据打通,连接公司的服务端登录接口B,你能想到几个解决方案?

1、修改就项目B的登录接口,兼容C客户端协议(可能影响线上接口,不稳定) 2、新增全新的登录接口F,采用C客户端协议(和旧的业务逻辑会重复) 3、新增一个转换协议接口,客户端C调用旧的B接口之前,使用转换接口转换下协议(适配器模式,推荐这个方式)

四、优缺点

  • 优点

    • 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

    • 增加灵活度, 提高复用性,适配器类可以在多个系统使用,符合开闭原则

  • 缺点

    • 整体类的调用链路增加,本来A可以直接调用C,使用适配器后 是A调用B,B再调用C

五、接口适配器编码

公共接口支付网关PayGateway

java
package com.lcy.study.design.adapter;

public interface PayGateway {
    /**
     * 支付
     **/
    void pay();

    /**
     * 退款
     **/
    void refund();

    /**
     * 查询
     **/
    void query();
}

支付网关适配器PayGatewayAdapter

java
package com.lcy.study.design.adapter;

public class PayGatewayAdapter  implements PayGateway{
    @Override public void pay() {
    }

    @Override public void refund() {
    }

    @Override public void query() {
    }
}

产品支付接口,只有支付和退款

java
package com.lcy.study.design.adapter;

public class ProductPay extends PayGatewayAdapter {
    @Override public void pay() {
        System.out.println("支付");
    }

    @Override public void refund() {
        System.out.println("退款");
    }
}