1、接口之间的桥梁-适配器设计模式
简介:讲解Adapeter设计模式和应用场景
-
适配器模式(Adapter Pattern)
见名知意,是作为两个不兼容的接口之间的桥梁,属于结构型模式
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
-
常见的几类适配器
-
类的适配器模式
- 想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
-
对象的适配器模式
- 想将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行
-
接口的适配器模式
- 不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即
-
-
应用场景
- 电脑需要读取内存卡的数据,读卡器就是适配器
接口之间的桥梁-适配器设计模式- 日常使用的转换头,如电源转换头,电压转换头
- 系统需要使用现有的类,而这些类的接口不符合系统的需要
- JDK中InputStreamReader就是适配器
- JDBC就是我们用的最多的适配器模式
JDBC给出一个客户端通用的抽象接口,每一个具体数据库厂商 如 SQL Server、Oracle、MySQL等,就会开发JDBC驱动,就是一个介于JDBC接口和数据库引擎接口之间的适配器软件
2、提高开发效率 接口适配器在日常开发里面的应用
简介:接口的适配器案例实战
-
设计模式的疑惑
会感觉到好像是理解了模式的功能,但是一到真实的系统开发中,就不知道如何使用这个模式了
前面每个案例都有讲实际的编码操作,大家一定要充分领悟
接口适配器
有些接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要实现部分接口就可以了
- 编码实战:
定义支付的接口:
public interface PayGateway {
/**
* 下单
*/
void unifiedorder();
/**
* 退款
*/
void refund();
/**
* 查询支付状态
*/
void query();
/**
* 发红包
*/
void sendRedPack();
}
增加一个Adapter,里面增加空实现:
public class PayGatewayAdapter implements PayGateway {
@Override
public void unifiedorder() {
}
@Override
public void refund() {
}
@Override
public void query() {
}
@Override
public void sendRedPack() {
}
}
定义一个产品实现,继承adapter,此处仅实现支付和退款功能,不用继承所有函数(因为adapter已经是空实现):
public class ProductVideoOrder extends PayGatewayAdapter {
@Override
public void unifiedorder() {
System.out.println("ProductVideoOrder unifiedorder");
}
@Override
public void refund() {
System.out.println("ProductVideoOrder refund");
}
}
另外定义一个vip,它还可以实现发红包功能:
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");
}
}
根据需要重写不同方法,不用实现所有方法。
3、生产环境接口-需要兼容新的业务怎么办?
简介:适配器案例实战,生产环境得的接口需要兼容新的业务
需求背景
小滴课堂里面有个电商支付项目,里面有个登录功能,已经线上运行了
客户端A 调用生产环境的登录接口B,且线上稳定运行了好几年。
某天,公司接到收购了别的公司的项目,需要把这套系统部署在起来,且收购的项目也有对应的客户端C,但是两个客户端和服务端的协议不一样
需求:收购的项目客户端C,需要做公司原来的项目用户数据打通,连接公司的服务端登录接口B,你能想到几个解决方案?
1、修改就项目B的登录接口,兼容C客户端协议(可能影响线上接口,不稳定)
2、新增全新的登录接口F,采用C客户端协议(和旧的业务逻辑会重复)
3、新增一个转换协议接口,客户端C调用旧的B接口之前,使用转换接口转换下协议(适配器模式,推荐这个方式)
-
总结
在使用一些旧系统或者是类库时,经常会出现接口不兼容的问题,适配器模式在解决这类问题具有优势
学习设计模式一定不要局限代码层面,要从软件系统整体去考虑,而不是为了使用设计模式,而去使用设计模式
-
优点
可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
增加灵活度, 提高复用性,适配器类可以在多个系统使用,符合开闭原则
缺点整体类的调用链路增加,本来A可以直接调用C,使用适配器后 是A调用B,B再调用C
4、适配器设计模式-类的适配器
简介:适配器案例实战,类的适配器
-
类的适配器模式
- 想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
老的类,里面有一个方法:
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");
}
}
Main方法:
public class Main {
public static void main(String[] args) {
TargetModule targetModule = new Adapter();
targetModule.methodA();
targetModule.methodB();
targetModule.methodC();
}
}
执行结果: