简介
1、⻅名知意,是作为两个不兼容的接⼝之间的桥梁,属于结构型模式
2、适配器模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作
常⻅的⼏类适配器
类的适配器模式
想将⼀个类转换成满⾜另⼀个新接⼝的类时,可以使⽤类的适配器模式,创建⼀个新类,继承原有的类,实现新的接⼝即可
对象的适配器模式
想将⼀个对象转换成满⾜另⼀个新接⼝的对象时,可以创建⼀个适配器类,持有原类的⼀个实例,在适配器类的⽅法中,调⽤实例的⽅法就⾏
接⼝的适配器模式
不想实现⼀个接⼝中所有的⽅法时,可以创建⼀个Adapter,实现所有⽅法,在写别的类的时候,继承Adapter类即
应⽤场景
1、电脑需要读取内存卡的数据,读卡器就是适配器
2、⽇常使⽤的转换头,如电源转换头,电压转换头
3、系统需要使⽤现有的类,⽽这些类的接⼝不符合系统的需要
4、JDK中InputStreamReader就是适配器
5、JDBC就是我们⽤的最多的适配器模式
JDBC给出⼀个客户端通⽤的抽象接⼝,每⼀个具体数据库⼚商 如 SQL Server、Oracle、MySQL等,就会开发JDBC驱动,就是⼀个介于JDBC接⼝和数据库引擎接⼝之间的适配器软件
提⾼开发效率 接⼝适配器在⽇常开发⾥⾯的应⽤
接⼝适配器
有些接⼝中有多个抽象⽅法,当我们写该接⼝的实现类时,必须实现该接⼝的所有⽅法,这明显有时⽐较浪费,因为并不是所有的⽅法都是我们需要的,有时只需要实现部分接⼝就可以了
demo
我并不想实现所有接口,只想重写部分接口
原始接口
public interface PayGateway {
/**
* 下单
*/
void unifiedorder();
/**
* 退款
*/
void refund();
/**
* 查询支付状态
*/
void query();
/**
* 发红包
*/
void sendRedPack();
}
适配器
public class PayGatewayAdapter implements PayGateway {
@Override
public void unifiedorder() {
}
@Override
public void refund() {
}
@Override
public void query() {
}
@Override
public void sendRedPack() {
}
}
使用部分接口
public class ProductVideoOrder extends PayGatewayAdapter {
@Override
public void unifiedorder() {
System.out.println("ProductVideoOrder unifiedorder");
}
@Override
public void refund() {
System.out.println("ProductVideoOrder refund");
}
}
使用部分接口 增加新方法
public class ProductVipOrder extends PayGatewayAdapter {
@Override
public void unifiedorder() {
System.out.println("ProductVipOrder unifiedorder");
}
@Override
public void refund() {
System.out.println("ProductVipOrder refund");
}
@Override
public void sendRedPack() {
System.out.println("ProductVipOrder sendRedPack");
}
}
⽣产环境接⼝-需要兼容新的业务怎么办
需求背景
有个电商⽀付项⽬,⾥⾯有个登录功能,已经线上运⾏了
客户端A 调⽤⽣产环境的登录接⼝B,且线上稳定运⾏了好⼏年。某天,公司接到收购了别的公司的项⽬,需要把这套系统部署在起来,且收购的项⽬也有对应的客户端C,但是两个客户端和服务端的协议不⼀样
需求:收购的项⽬客户端C,需要做公司原来的项⽬⽤户数据打通,连接公司的服务端登录接⼝B,你能想到⼏个解决⽅案?
1、修改就项⽬B的登录接⼝,兼容C客户端协议(可能影响线上接⼝,不稳定)
2、新增全新的登录接⼝F,采⽤C客户端协议(和旧的业务逻辑会重复)
3、新增⼀个转换协议接⼝,客户端C调⽤旧的B接⼝之前,使⽤转换接⼝转换下协议(适配器模式,推荐这个⽅式)
总结
1、在使⽤⼀些旧系统或者是类库时,经常会出现接⼝不兼容的问题,适配器模式在解决这类问题具有优势
2、学习设计模式⼀定不要局限代码层⾯,要从软件系统整体去考虑,⽽不是为了使⽤设计模式,⽽去使⽤设计模式
优点
1、可以让任何两个没有关联的类⼀起运⾏,使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作
2、增加灵活度, 提⾼复⽤性,适配器类可以在多个系统使⽤,符合开闭原则
缺点
整体类的调⽤链路增加,本来A可以直接调⽤C,使⽤适配器后 是A调⽤B,B再调⽤C
适配器设计模式-类的适配器
简介
想将⼀个类转换成满⾜另⼀个新接⼝的类时,可以使⽤类的适配器模式,创建⼀个新类,继承原有的类,实现新的接⼝即可
demo
老的原始类
public class OldModule {
public void methodA(){
System.out.println("OldModule methodA");
}
}
新的目标接口
public interface TargetModule {
/**
* 和需要适配的类方法名一样
*/
void methodA();
/**
* 新的方法,如果有多个新的方法直接编写就行
*/
void methodB();
void methodC();
}
适配器
public class Adapter extends OldModule implements TargetModule {
/**
* 新的方法,和老的类方法不一样
*/
@Override
public void methodB() {
System.out.println("Adapter methodB");
}
/**
* 新的方法,和老的类方法不一样
*/
@Override
public void methodC() {
System.out.println("Adapter methodC");
}
}
测试
public class Main {
public static void main(String[] args) {
TargetModule targetModule = new Adapter();
targetModule.methodA();
targetModule.methodB();
targetModule.methodC();
}
}
结果
0ldModule methodA
Adapter methodB
Adapter methodC